社区
Linux/Unix社区
帖子详情
为什么在linux下socket发送缓冲区没有写满,send就返回错误
爱为心
2015-11-09 05:46:23
如题,在linux下建立了tcp连接,使用setsockopt()设置发送缓冲区大小为100K(其实是按50K设置的,但是内核加倍了),然后使用send(非阻塞)发送数据,一直写,直到send返回错误,然后使用ioctl查看已使用缓冲区大小,发现这个值一直小于发送缓冲区100K,而且大小每次都不一样。这是什么原因?
...全文
453
5
打赏
收藏
为什么在linux下socket发送缓冲区没有写满,send就返回错误
如题,在linux下建立了tcp连接,使用setsockopt()设置发送缓冲区大小为100K(其实是按50K设置的,但是内核加倍了),然后使用send(非阻塞)发送数据,一直写,直到send返回错误,然后使用ioctl查看已使用缓冲区大小,发现这个值一直小于发送缓冲区100K,而且大小每次都不一样。这是什么原因?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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(非阻塞)发送数据会返回错误。
linux
socket
接收缓存区,
socket
的发送和接收缓冲区
对于每一个TCP的
SOCKET
来说,都有一个
发送缓冲区
和接受缓冲区与之对应,下面举个例子说说
发送缓冲区
、接受缓冲区、滑动窗口协议之间的关系。一、recv端在监听套接字上准备accept,在accept结束以后不做什么操作,直接sleep很久,也就是在recv端并不做接收数据的操作,在sleep结束之后再recv数据。二、
send
端通过查看本系统内核支持的
发送缓冲区
大小,cat/proc/sys/n...
Linux
的
socket
缓冲区
Linux
的soket缓冲区 每个
socket
被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。 write()/
send
() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功
返回
,不管它们有
没有
到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。 TCP协议独立于 write()/s...
Linux
下设置
socket
的发送和接收缓冲区
Linux
下设置
socket
的发送和接收缓冲区
linux
下
socket
内核缓冲区的大小
本次尝试主要研究
linux
socket
接受
发送缓冲区
的大小,以及当缓冲区阻塞时,能发送多少数据。 (1)实验与尝试 测试环境: vmware虚拟机 centos7系统。 服务端建立连接后睡眠,应用层不接受任何数据,只有内核接受缓冲区才接受数据。 服务端代码如下: #include<stdio.h> #include<stdlib.h> #include<...
linux
下
send
函数缓冲区问题,TCP
Send
函数的阻塞和非阻塞,以及TCP发送数据的异常情况...
有了 TCP 协议本身的 ACK 机制为什么还需要业务层的ACK 机制?答:这个问题从操作系统(
linux
/windows/android/ios)实现TCP协议的原理角度来说明更合适:1 操作系统在TCP发送端创建了一个TCP
发送缓冲区
,在接收端创建了一个TCP接收缓冲区;2 在发送端应用层程序调用
send
()方法成功后,实际是将数据写入了TCP
发送缓冲区
;3 根据TCP协议的规定,在TCP连接...
Linux/Unix社区
23,120
社区成员
74,507
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章