2011-05-15 48 views
4

我正在使用gevent修补的套接字连接到流式服务器,并且正在使用adsl连接。如何检测套接字断开? /如何在超时时调用socket.recv?

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

我试着设置socket.SO_RCVTIMEO几秒钟,但没有检测到断开连接,recv一直继续“阻塞”。这是gevent,所以它只能阻止绿色线程,但我需要尽快检测到这种断开连接,因此我可以尝试重新连接。

回答

4

使用由GEVENT提供的超时,例如在与语句:

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

或作为一个函数:

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

它没有检测到断线,因为没有任何断线,TCP“连接”仍然存在并假设可靠。例如,如果拔下LAN电缆并重新插入,则连接仍然可以工作。

如果你真的想尽快检测到断开连接,那么我想你应该每秒钟解析os网络状态(ifconfig/ipconfig)/或使用os事件,并且在检测到网络断开连接时做你想做的事情。

相关问题