我正在使用gevent修补套接字连接到流媒体服务器,我正在使用adsl连接.
我不控制服务器,但在我的测试中,如果我停止服务器,我可以通过检查recv的结果是否为空字符串来检测断开连接,但如果我关闭我的adsl调制解调器,则recv永远不会退出.如果我只是断开我的计算机的网络电缆,它也不会返回空字符串,但是当我重新连接它时,它会返回服务器在此期间发送的所有内容,所以我猜测路由器或调制解调器正在保持连接为我打开在我的网络电缆断开连接时缓冲流.
我尝试将socket.SO_RCVTIMEO设置为几秒钟,但它没有检测到断开连接,recv继续“阻止”永久.这是gevent,所以它只阻止greenthread,但我需要尽快检测到这种断开连接,所以我可以尝试重新连接.
解决方法:
使用gevent提供的超时,例如在with语句中:
with Timeout(5, False):
data = sock.recv()
或作为一种功能:
data = gevent.with_timeout(5, sock.recv, timeout_value="")