我使用gevent补丁套接字连接到流服务器,使用adsl连接。
我不控制服务器,但在我的测试中,如果我停止服务器,我可以通过检查recv的结果是否为空字符串来检测断开连接,但如果我关闭adsl调制解调器recv,则永远不会退出。如果我只是断开计算机的网线,它也不会返回空字符串,但当我重新连接它时,它会返回服务器同时发送的所有内容,所以我猜路由器或调制解调器会为我保持连接打开,并在我的网线断开时缓冲流。
我试着将socket.SO_RCVTIMEO设置为几秒钟,但它没有检测到断开连接,recv继续“阻塞”永远。这是gevent,所以它只会阻塞greenthread,但是我需要尽快检测到这个断开连接,以便尝试重新连接。
使用gevent提供的超时,例如在with语句中:
或作为功能:
它没有检测到断开连接,因为没有任何断开连接,TCP“连接”仍然是活动的,并且应该是可靠的。例如,如果拔下LAN电缆,然后重新插上,连接仍将工作。
如果你真的想尽快检测到断开连接,那么我想你应该每秒钟分析一次操作系统网络状态(ifconfig/ipconfig)/或者使用操作系统事件,然后在检测到网络断开连接时做你想做的事情。
相关问题 更多 >
编程相关推荐