如何检测套接字断开连接?如何设置套接字接收超时时间?

4

我正在使用gevent修补的socket连接到一个流媒体服务器,我的连接方式是ADSL。

虽然我无法控制服务器,但在我的测试中,如果停止服务器,只需检查recv返回结果是否为空字符串即可检测到断开连接的情况。但是,如果关闭我的adsl调制解调器,recv永远不会退出。如果仅仅是拔下电脑的网络电缆,它也不会返回空字符串,当我重新连接时,它会返回期间服务器发送的所有内容,因此我猜想路由器或调制解调器为我保持连接,并在我的网络电缆断开时缓冲流。

我尝试将socket.SO_RCVTIMEO设置为几秒钟,但它并没有检测到断开连接,recv仍然“阻塞”了很长时间。由于这是基于gevent的应用程序,因此仅会阻塞greenthread,但我需要尽快检测到此断开连接情况,以便尝试重新连接。

2个回答

4
使用gevent提供的超时功能,例如在with语句中使用:
with Timeout(5, False):
    data = sock.recv()

或者作为一个函数:
data = gevent.with_timeout(5, sock.recv, timeout_value="")

2

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

如果您真的想尽快检测到断开连接,那么我想您应该每秒解析一次操作系统的网络状态(ifconfig / ipconfig),或使用操作系统事件,在检测到网络断开连接时执行所需操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接