- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络编程 read() 函数详解
2015-8-7网络编程总结
read()读函数特性 + 实例:
问题描述:网络编程,运行的时候有没有遇到过程序运行没有按自己设计的流程走,打印乱码,打印多了少了。如果有且翻来覆去找不到问题所在,那么你可能需要详细的了解一下read函数的运行机制。
客户端与服务器连接 套接字sockfd;
1.sockfd好比是连接呼客户端与服务器的管道,管道有内存大小,可以用write函数
向里面写入数据,也可以read读出数据。遵循先进先出原则,sockfd中的数据不会自动
清除,只可以被read读出n个少n个;
服务器代码: while(proc_echo(sockfd);
客户端代码:
输入:
输出
解释:这段代码是客户端服务器write送据,服务器read后原样打印,且每次只read一个字符,大家思考一下,我明明只write了两次,而服务器每次read一个字符总共成功read了26次(26个字符,我测试时是一个字符一个字符打印的)。是不是很想C里的scanf之类的函数?
结论:read,write次数并不一定是对应的,read函数类似scanf getchar 函数,只要套接字sockfd(相当与缓存区)里有数据就能被read读取并接触read的阻塞状态 ,直到sockfd是空的,read函数读不到数据才会阻塞,当然前提是程序能执行到read。至于write函数,没什么好说的,次数取决于你,你想输如几次就几次。由此可见,编程时不需要考虑read write函数执行先后顺序。最后提醒大家,网络编程时控制好read write数据块的大小。
乱码:多半是你打印的字符串缺少结束符。
什么时候需要加结束符呢?当然是缺少结束符时加。比如:
服务器:write(sockfd, “123456\0”, 7);
客户端:read(sockfd, buf, 3);
read(sockfd, buf, 4);
第二次不必加。
问题二:我以上的代码服务器客户端各有一对 read write(拿掉注释)。而且都是同一个套接字sockfd,那么问题来了,在一端write的数据会不会被同一端的read读到呢(比如服务器write数据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));
buffer[ret]=0; //
}
服务器:getchar停顿,read接收发来的数据并打印,再write字符串“@@”同样是循环的
int ret;
char buf[BUFFER_SIZE];
getchar();//停顿
ret = read(sockfd, buf, 1);//读4个字符
buf[ret] = 0;
printf(%s, buf);//注意打印加换行
fflush(stdout);
ret=write(sockfd,@@,3);
return -1;
测试:
客户端输入:
服务器输出:
结论:不会,整个程序只有服务器端有read,服务器write“@@”,并没有打印出来,所以read不会接收本端发送的write。
有人会问,那么服务器write的“@@”哪去了?其实还在sockfd中,只是本端read不到的。你只要把客户端的read放出来测试就会发现客户端能read到服务器的write,打印“@@”。
总结:套接字类似全双工管道,两边都能读写,一边写的只能在另一边读出来,遵循先进先出。可以理解成两个方向相反合并的队列
问题三:大家做项目时有没有遇到过这样的问题,聊天模块多线程或多进程,有时自己write发的数据被自己的read接收了。那么是不是真的进程线程之间会相互干扰呢?大家可以通过以上的分析思考下。
本人测试过了,答案是不会,这里简单分析下就不上图了。
先说多线程,子线程只是一个
您可能关注的文档
- 维氏瑞士军刀各部件使用方法介绍.docx
- 维修电工培训--电缆、接线.ppt
- 维生素B2与发酵.ppt
- 绪论-热能.ppt
- 维生素C的故事公开课课件.ppt
- 维生素B1片重量差异和脆碎度法检查.ppt
- 维生素市场现状与饲用维生素必威体育精装版进展.ppt
- 维生素E的药理作用及相关价值.ppt
- 综保说明书(照明1140).doc
- 绵竹(澳东)锅炉运行规程.doc
- 10《那一年,面包飘香》教案.docx
- 13 花钟 教学设计-2023-2024学年三年级下册语文统编版.docx
- 2024-2025学年中职学校心理健康教育与霸凌预防的设计.docx
- 2024-2025学年中职生反思与行动的反霸凌教学设计.docx
- 2023-2024学年人教版小学数学一年级上册5.docx
- 4.1.1 线段、射线、直线 教学设计 2024-2025学年北师大版七年级数学上册.docx
- 川教版(2024)三年级上册 2.2在线导航选路线 教案.docx
- Unit 8 Dolls (教学设计)-2024-2025学年译林版(三起)英语四年级上册.docx
- 高一上学期体育与健康人教版 “贪吃蛇”耐久跑 教案.docx
- 第1课时 亿以内数的认识(教学设计)-2024-2025学年四年级上册数学人教版.docx
文档评论(0)