读书人

急非阻塞socket通过select始终无法可写

发布时间: 2012-03-20 14:01:11 作者: rapoo

急!非阻塞socket通过select始终无法可写的问题
使用两块网卡,配置两个IP,建立2个TCP连接通道,周期发送数据(一周期大约发送10K-20K数据),设计一个通道断开(网卡禁用、拔出网线)再恢复后,通过维护线程保证通道能够及时重连。socket使用的是非阻塞,通过select判断是否可写,然后向网络发送数据。SO_LINGER选项设为 0。
但奇怪的是其中一个网段开始可以正常发送数据,但一段时间后就没有数据收发,但另一个始终正常。通过观察是在判断socket是否可写时,总是返回超时。强制send也是直接返回10035。
在网上搜索了一下,遇到这种问题的好像比较少,有建议将socket发送缓冲区设大,我设为20K,情况有所好转,没有再发生一个通道开始就不发送的情况。但在断开几次网络,或禁用几次网卡后,对应的socket仍然会发生无法收发的问题。但TCP状态是establised。
PS:这个问题最早是在Vmware虚拟机上测试发生,但在真实的物理双网中也是如此。按常理socket不可写的情况很少见,百思不得其解,请高手指点!

[解决办法]
方法一:清空缓冲区试试
方法二:重连TCP
[解决办法]
10035 无法立即完成一个非阻挡性套接字操作。
这是非阻塞socket常遇到的,说明此时发送缓冲区满了。
你判断下另外一端就是接收数据的一端是不是接收太慢了,或者没有再recv。

ls说的清空缓冲区是个办法,但是这样就把数据丢失了,并不能根本解决问题。
清空好像只能closesocket了吧,其他方法不晓得。

[解决办法]
缓冲区满了,定时重发。

读书人网 >网络协议

热点推荐