




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2015-8-7网络编程总结 read()读函数特性 + 实例: 问题描述:网络编程,运行的时候有没有遇到过程序运行没有按自己设计的流程走,打印乱码,打印多了少了。如果有且翻来覆去找不到问题所在,那么你可能需要详细的了解一下read函数的运行机制。客户端与服务器连接 套接字sockfd; 1.sockfd好比是连接呼客户端与服务器的管道,管道有内存大小,可以用write函数 向里面写入数据,也可以read读出数据。遵循先进先出原则,sockfd中的数据不会自动 清除,只可以被read读出n个少n个;服务器代码: while(proc_echo(sockfd); 客户端代码:输入:输出解释:这段
2、代码是客户端服务器write送据,服务器read后原样打印,且每次只read一个字符,大家思考一下,我明明只write了两次,而服务器每次read一个字符总共成功read了26次(26个字符,我测试时是一个字符一个字符打印的)。是不是很想C里的scanf之类的函数?结论:read,write次数并不一定是对应的,read函数类似scanf getchar 函数,只要套接字sockfd(相当与缓存区)里有数据就能被read读取并接触read的阻塞状态 ,直到sockfd是空的,read函数读不到数据才会阻塞,当然前提是程序能执行到read。至于write函数,没什么好说的,次数取决于你,你想输如
3、几次就几次。由此可见,编程时不需要考虑read write函数执行先后顺序。最后提醒大家,网络编程时控制好read write数据块的大小。乱码:多半是你打印的字符串缺少结束符。什么时候需要加结束符呢?当然是缺少结束符时加。比如:服务器:write(sockfd, “1234560”, 7);客户端:read(sockfd, buf, 3); read(sockfd, buf, 4);第二次不必加。问题二:我以上的代码服务器客户端各有一对 read write(拿掉注释)。而且都是同一个套接字sockfd,那么问题来了,在一端write的数据会不会被同一端的read读到呢(比如服务器write
4、数据buf,紧跟着服务器read,read会不会读到buf)?我们可以做这样的测试。客户端服务器我注释掉客户端的write,放出服务器的read write伪代码如下:客户端:只向服务器发送输入的数据 while(1) printf("Enter the message : "); fgets(buffer,sizeof(buffer)-1,stdin); ret=write(sockfd,buffer,strlen(buffer); bufferret=0; / 服务器:getchar停顿,read接收发来的数据并打印,再write字符串“”同样是循环的 int ret;
5、 char bufBUFFER_SIZE; getchar();/停顿 ret = read(sockfd, buf, 1);/读4个字符 bufret = 0; printf("%s", buf);/注意打印加换行 fflush(stdout); ret=write(sockfd,"",3); return -1;测试:客户端输入:服务器输出:结论:不会,整个程序只有服务器端有read,服务器write“”,并没有打印出来,所以read不会接收本端发送的write。有人会问,那么服务器write的“”哪去了?其实还在sockfd中,只是本端read不到
6、的。你只要把客户端的read放出来测试就会发现客户端能read到服务器的write,打印“”。总结:套接字类似全双工管道,两边都能读写,一边写的只能在另一边读出来,遵循先进先出。可以理解成两个方向相反合并的队列问题三:大家做项目时有没有遇到过这样的问题,聊天模块多线程或多进程,有时自己write发的数据被自己的read接收了。那么是不是真的进程线程之间会相互干扰呢?大家可以通过以上的分析思考下。本人测试过了,答案是不会,这里简单分析下就不上图了。先说多线程,子线程只是一个函数,它与主线程共用争夺一个套接字sockfd,这样的话问题就和上面的问题一样了,客户端服务器之间只有一条”管道“sockfd“,因此理论上是不会的实际上也不会。至于多进
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 会务公司会议合同范本
- 2025年金华年货运从业资格证考试题大全
- 公司保险担保合同范本
- 农民养车用车合同范本
- 佣金制合同范本
- 公司资产入股合同范本
- 代理签订协议合同范本
- 养殖木船出售合同范本
- 公司部分收购合同范本
- 产品独家使用合同范本
- 申论公务员考试试题与参考答案(2024年)
- 《幼儿行为观察与分析案例教程》教学教案
- 小学科学教育课程实施方案
- 钳工工艺学(第6版)完整全套教学课件
- DB11T 1035-2013 城市轨道交通能源消耗评价方法
- 2024新能源光伏电站运行规程和检修规程
- 供应室课件大全
- 有机化学完整版本
- 银行存管三方协议书
- 2024义务教育道德与法治课程标准(2022版)
- 2024年新人教版化学九年级上册全册课件(新版教材)
评论
0/150
提交评论