2011-05-15 74 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事件,並且在檢測到網絡斷開連接時做你想做的事情。

相關問題