为什么在linux下socket发送缓冲区没有写满,send就返回错误

爱为心 2015-11-09 05:46:23
如题,在linux下建立了tcp连接,使用setsockopt()设置发送缓冲区大小为100K(其实是按50K设置的,但是内核加倍了),然后使用send(非阻塞)发送数据,一直写,直到send返回错误,然后使用ioctl查看已使用缓冲区大小,发现这个值一直小于发送缓冲区100K,而且大小每次都不一样。这是什么原因?
...全文
453 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangxingmeng 2015-11-21
  • 打赏
  • 举报
回复
数据在发送缓冲区中肯定有一部分会被发送出去的,找一个差一点的网络环境,可能就能看到了
爱为心 2015-11-19
  • 打赏
  • 举报
回复
你说的确实如此。但是send错误返回时使用SIOCOUTQ发现返回值远远小于我设置的缓冲区的大小,而在内核中,此时已经认为缓冲区已经满了。这是我当时困惑的地方。
FightForProgrammer 2015-11-17
  • 打赏
  • 举报
回复
是不是你写的太多,缓存区已经满了,但是又没有发送出去,导致再次写缓存区失败
looklzg1108 2015-11-16
  • 打赏
  • 举报
回复
Mark 下,谢谢楼主分享。
爱为心 2015-11-10
  • 打赏
  • 举报
回复
没有人吗?帮顶一下吧。 又看了一下内核源码以及一些资料,才看出来一点头绪。在linux下tcp通信中使用SIOCOUTQ返回的值只是反映了tcp发送缓冲区中未发送的用户数据的大小;而tcp发送缓冲区中存放的数据还需要包含分片信息,长度要大于用户数据。所以虽然SIOCOUTQ返回值小于tcp的发送缓冲区大小,但是在内部其实已经没用空闲空间可用了。这时再送send(非阻塞)发送数据会返回错误。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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