首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

急非阻塞socket通过select始终无法可写的有关问题

2012-03-20 
急!非阻塞socket通过select始终无法可写的问题使用两块网卡,配置两个IP,建立2个TCP连接通道,周期发送数据(

急!非阻塞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了吧,其他方法不晓得。

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

热点排行