关于socket的read函数

XM3990205HZ2552 2019-03-07 10:19:55
深入理解计算机原理上有个健壮的read函数如下:


看书上说网络编程中可以用这个函数。我用这个函数接受数据的时候,如果对端发送的数据比较少,而我这边的buf size太大的话,读取一次之后会阻塞在read上,显然是有问题的,这个函数应该如何使用呢?
...全文
939 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZacCchary 2019-04-17
  • 打赏
  • 举报
回复
你的注意力应该放在这个函数什么时候返回,这个函数是为了读一定长度到缓冲区数据,无论用在读文件数据或者是网络socket fd皆可。
这个函数的着重点是在read的返回这里,只要上面的while判断数据缓冲区内还需要读,就会一直调用read去读,你调用时候对端发送数据少于预读取的缓冲区长度,read循环等待是正常的,除非你对端发送完毕,加Ctrl+D模拟发送一个EOF而导致对端进程退出(或者每发一句直接关闭连接),在关闭连接时会发送一个fin给这个函数的进程,进程收到fin后给read返回0,表示对端关闭,此函数返回读到的长度而不是预读的数据缓冲区长度。在其他情况下:对端错误返回-1,和以上对端关闭情况一致,只不过函数没有返回已读到的长度;或者是被信号中断返回-1,就继续读够长度或发现对端关闭(不论是否正常关闭)为止。
以上你好好斟酌一下,注意力反正read返回值这里就好理解。
XM3990205HZ2552 2019-03-07
  • 打赏
  • 举报
回复
引用 1 楼 qq_42307333 的回复:
你这里nleft初始化为n,当n比nread大的时候,nleft-nread当然是大于0了,会进行第二次循环,但是已经没有数据可读,read就阻塞了


是这样的,但是这本书上是推荐用这个函数代替原生的read,不知道这个函数的应用场景是怎样的
qq_42307333 2019-03-07
  • 打赏
  • 举报
回复
你这里nleft初始化为n,当n比nread大的时候,nleft-nread当然是大于0了,会进行第二次循环,但是已经没有数据可读,read就阻塞了

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧