socket 发送缓冲区问题

http://www.ixpub.net/thread-1426471-2-1.html
如果write的字节数>socket发送缓冲区,tcp做何处理?
原帖由 xltao 于 2006-6-9 13:35 发表
"我前面所说的"能发多少发多少.. 返回发送成功的字节数"适用于TCP连接的阻塞模式:
如果需要发送的字节数超出缓存大小,系统依然流式发送,全部发送完需要发送的字节后返回(可以理解为阻塞);
在非 ...



如果是非阻塞模式,是在设定的发送时间范围内能发多少发多少.
在实际应用中,情况如下:
在非阻塞模式下,一般是用setsockopt函数设置发送阻塞的时间,然后调用send()发送数据,当超出这个时间,send函数会返回已发送的数据大小, 但是请注意此时缓存中可能还有些数据没有发送到网络上.
那么当在应用层再一次调用send函数时,就会报告经典的错误:
Resource temporarily unavailable
那么如果是阻塞情况,send函数会一直等到所有应用层的数据全部发送完毕再返回...

另外,如果是用UDP作为发送端,那么都不需要考虑阻塞不阻塞的情况,会报告错误:
Message too long

[ 本帖最后由 yulc 于 2006-6-10 10:28 编辑 ]
清空Socket发送缓冲区通常是为了确保数据能够及时地发送出去,防止因为缓冲区满而导致的数据丢失或者延迟。在TCP/IP协议中,发送数据通常是通过将数据写入到发送缓冲区,然后由操作系统负责管理发送。如果你想强制清除这个缓冲区,可以尝试以下几种方法: 1. **Shutdown Output**(关闭输出流):在Java中,你可以使用`Socket.shutdownOutput()`方法,这会通知底层操作系统的套接字库停止进一步的数据发送,但不会立即清除缓冲区。系统可能会在后续网络活动结束后自动清理。 ```java try { socket.shutdownOutput(); } catch (IOException e) { // handle exception } ``` 2. **Zero-copy send**:如果可能,你可以选择直接从应用程序内存发送数据,比如使用`sendfile`系统调用或`sendmsg`等底层API,这样实际上是在绕过发送缓冲区,而不是清空它。 3. **Force write**:虽然不推荐,但在某些极端情况下,你可以尝试读取整个缓冲区然后再写回去,但这不是一个高效的做法,且可能导致性能下降。 4. **连接关闭**:如果你想要完全结束通信并释放所有资源,包括缓冲区,可以关闭整个连接:`socket.close()`。但是请注意,这也将断开客户端与服务器之间的连接。 得注意的是,不是所有的编程语言或环境都提供直接清空发送缓冲区的操作,上述方法大部分适用于基于TCP网络编程。此外,频繁地主动清空缓冲区并不常见,因为它会增加网络开销,并且不是必要的优化措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值