我正在使用gevent修補的套接字連接到流式服務器,並且正在使用adsl連接。如何檢測套接字斷開? /如何在超時時調用socket.recv?
我不控制服務器,但在我的測試中,如果我停止服務器,我可以通過檢查recv的結果是否爲空字符串來檢測斷開連接,但如果關閉我的adsl調制解調器,recv永不退出。如果我只是斷開計算機的網線,它也不會返回一個空字符串,但是當我重新連接它時,它將返回服務器發送的所有內容,所以我猜測路由器或調制解調器正在爲我保持連接並在我的網線斷開連接時緩衝流。
我試着設置socket.SO_RCVTIMEO幾秒鐘,但沒有檢測到斷開連接,recv一直繼續「阻塞」。這是gevent,所以它只能阻止綠色線程,但我需要儘快檢測到這種斷開連接,因此我可以嘗試重新連接。