wang37921 2014-03-25 14:51
浏览 4733

echo测试服务器和客户端,大量连接失败,关闭时又会出现僵尸established连接

写了个测试客户端和服务器,服务器使用IOCP,客户端使用select。客户端开始时指定开启512个socket连接服务器。连接失败则重新连接,连接成功,则发送数据到服务器。服务器收到数据就回复同样的字符给客户端。

但是出现以下情况:
1.客户端开启512个连接,只有一部分连接的上。错误的提示是10060,连接超时,服务器accept的错误是64(网络明不再可用)。
感觉是不是,服务器连接上了,没来及处理,导致客户端删除,服务器处理时,又晚了。有没方法解决?一开始猜测是不是select后,在exceptfdset中可以不用理他,继续投递,测试后感觉又不是这个样子。因为,我这样测试:把select等待时间弄成0,0即刻返回,但是accept也有既不是成功也不是except中,说明不出错是会去等待的,不是非成功就失败的。但这种TimeOut是正常的吗?可以把这个TimeOut时间调长点吗?

2.客户端关闭后,他的一部分socket关不掉,服务器上netstat查看发现有部分established连接依旧在。
是不是客户端某些连接关闭时发送的FIN丢失或未发送?我认为如果对这种对端实际关闭的established连接,进行send,投递后,会返回错误,因为我认为send后会得到回馈,就如syn-ack一样。但是测试后发现,send居然还是可以成功,搜索网络后,得到的结论是,send,仅仅是发送到系统缓存,成功只是说明发送到缓冲区了,对端收得到否,得不到回馈。不知这个结论是不是正确的?这种僵尸established连接是不是有可能在对端不正常关闭(拔网线等极端状态)时存在?目前我使用开启keep-alive选项解决。这种僵尸established连接,程序会稍后recv得到通知而断开。
最后,经过分析和实验,我感觉,以上的问题是网络不可阻的问题,最后我只是在程序中为每个连接开启了keep alive的选项。

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
    • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
    • ¥20 腾讯企业邮箱邮件可以恢复么
    • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
    • ¥15 错误 LNK2001 无法解析的外部符号
    • ¥50 安装pyaudiokits失败
    • ¥15 计组这些题应该咋做呀
    • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
    • ¥15 让node服务器有自动加载文件的功能