如何检测插座断开?/如何在超时时调用socket.recv?

2024-05-23 13:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用gevent补丁套接字连接到流服务器,使用adsl连接。

我不控制服务器,但在我的测试中,如果我停止服务器,我可以通过检查recv的结果是否为空字符串来检测断开连接,但如果我关闭adsl调制解调器recv,则永远不会退出。如果我只是断开计算机的网线,它也不会返回空字符串,但当我重新连接它时,它会返回服务器同时发送的所有内容,所以我猜路由器或调制解调器会为我保持连接打开,并在我的网线断开时缓冲流。

我试着将socket.SO_RCVTIMEO设置为几秒钟,但它没有检测到断开连接,recv继续“阻塞”永远。这是gevent,所以它只会阻塞greenthread,但是我需要尽快检测到这个断开连接,以便尝试重新连接。


Tags: 字符串服务器内容调制解调器so计算机gevent路由器
2条回答

使用gevent提供的超时,例如在with语句中:

with Timeout(5, False):
    data = sock.recv()

或作为功能:

data = gevent.with_timeout(5, sock.recv, timeout_value="")

它没有检测到断开连接,因为没有任何断开连接,TCP“连接”仍然是活动的,并且应该是可靠的。例如,如果拔下LAN电缆,然后重新插上,连接仍将工作。

如果你真的想尽快检测到断开连接,那么我想你应该每秒钟分析一次操作系统网络状态(ifconfig/ipconfig)/或者使用操作系统事件,然后在检测到网络断开连接时做你想做的事情。

相关问题 更多 >