当前位置: 技术问答>linux和unix
非阻塞方式socket send()返回大小和实际发送大小不一致
来源: 互联网 发布时间:2017-04-26
本文导语: 本帖最后由 JERRY_PRI 于 2013-09-18 11:39:28 编辑 碰到一个网络问题,发现tcp方式在非阻塞模式下,send的返回大小和实际发送大小不一致,设置增加发送缓冲区大小之后也没有好用,按tcp的理论应该是写到缓冲区,然后tcp...
|
完全是正常现象,send返回值小于发送值是异步网络编程基础常识。
异步网络发送数据,必须有一个应用层缓冲区,对于SendMessage这种应用层接口,其实现逻辑:
1,如果buffer空,则调用send发送。
2,如果buffer不空,则直接把数据追加到buffer尾部。
3,如果send返回值小于请求值或者返回-1(EAGAIN/EINTR),那么将剩余数据存入buffer,并设置write事件。
4,write事件触发则将buffer中的数据send出去,如果send后buffer为空则取消write事件,否则保持。
异步网络发送数据,必须有一个应用层缓冲区,对于SendMessage这种应用层接口,其实现逻辑:
1,如果buffer空,则调用send发送。
2,如果buffer不空,则直接把数据追加到buffer尾部。
3,如果send返回值小于请求值或者返回-1(EAGAIN/EINTR),那么将剩余数据存入buffer,并设置write事件。
4,write事件触发则将buffer中的数据send出去,如果send后buffer为空则取消write事件,否则保持。