首页 > 试题

read怎么读

更新时间:2022-11-13 10:41:48 阅读: 评论:0

中学学科网高中-四书五经六艺


2022年11月13日发(作者:传统文化资料)

2015-8-7网络编程总结

read()读函数特性+实例:

问题描述:网络编程,运行的时候有没有遇到过程序运行没有按自

己设计的流程走,打印乱码,打印多了少了。如果有且翻来覆去找

不到问题所在,那么你可能需要详细的了解一下read函数的运行

机制。

客户端与服务器连接套接字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函数,没什么好说的,次数取决于你,你想输如几次就几次。

由此可见,编程时不需要考虑readwrite函数执行先后顺序。最

后提醒大家,网络编程时控制好readwrite数据块的大小。

乱码:多半是你打印的字符串缺少结束符。

什么时候需要加结束符呢?当然是缺少结束符时加。比如:

服务器:write(sockfd,“1234560”,7);

客户端:read(sockfd,buf,3);

read(sockfd,buf,4);

第二次不必加。

问题二:我以上的代码服务器客户端各有一对readwrite(拿掉

注释)。而且都是同一个套接字sockfd,那么问题来了,在一端write

的数据会不会被同一端的read读到呢(比如服务器write数据buf,

紧跟着服务器read,read会不会读到buf)?我们可以做这样的测

试。

客户端服务器我注释掉客户端的write,放出服务器的readwrite

伪代码如下:

客户端:只向服务器发送输入的数据

while(1)

{

printf("Enterthemessage:");

fgets(buffer,sizeof(buffer)-1,stdin);

ret=write(sockfd,buffer,strlen(buffer));

buffer[ret]=0;//

}

服务器:getchar停顿,read接收发来的数据并打印,再write字

符串“@@”同样是循环的

intret;

charbuf[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接收了。那么

是不是真的进程线程之间会相互干扰呢?大家可以通过以上的分

析思考下。

本人测试过了,答案是不会,这里简单分析下就不上图了。

先说多线程,子线程只是一个函数,它与主线程共用争夺一个套接

字sockfd,这样的话问题就和上面的问题一样了,客户端服务器之

间只有一条”管道“sockfd“,因此理论上是不会的实际上也不会。

至于多进程,子进程是父进程的一个副本,等于各自有一条通向服

务器的一模一样”管道“,两个管道之间当然是不会存在通信的。

附加:上述问题究竟出在哪,我只能说是程序逻辑出了问题,只有

尽量理清你的程序架构吧。

本文发布于:2022-11-13 10:41:48,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/88/10536.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:read怎么读
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图