2010-04-23 283 views
2

我知道Twisted可以做到這一點,但簡單的套接字呢?套接字丟失連接

你怎麼知道你是否隨機丟失了你在socket中的連接?比如說,如果我的互聯網不得不退出並重新開始。

回答

0

如果互聯網時時刻刻都來臨,您可能實際上不會丟失TCP會話。如果你這樣做,套接字API會拋出一些異常,通常是socket.timeout。

+1

我不認爲它真的發出任何異常。它只是坐在那裏,什麼都不做。 – 2010-04-23 11:13:19

+0

啊是的,你必須調用'socket.settimeout()'。我不確定如何區分傳輸中的長時間停頓和實際中斷。抱歉。 – 2010-04-23 11:23:59

1

我假設你正在談論TCP。

如果您的網絡連接暫時停止,您可能根本不會丟失TCP連接,它只會重新傳輸並恢復操作。

有100多條你可能會失去連接的其他原因(例如,一個NAT網關在無意間斷開連接,另一端被核彈擊中,你的路由器燒燬了,另一端的那個人猛拉他的網線,等等,等等)

這裏是你應該做的,如果你需要檢測死同行/關閉插座等:

  • 從插座或以任何其他方式等待閱讀它上面的傳入數據事件。這樣可以檢測連接是正常關閉還是發生錯誤(讀取時返回0或-1) - 至少如果另一端仍然能夠向主機發送TCP FIN/RST或ICMP數據包。

  • 寫入插座 - 例如每N秒發送一次心跳。只要從套接字中讀取,在另一端靜靜地失敗時就不會檢測到問題。如果該PC脫機,它顯然可能不會告訴你它已經這麼做 - 所以你必須發送一些東西,看看它是否響應。

  • 如果你不想每隔N秒寫一次心跳,你至少可以打開TCP keepalive - 並且如果對方死了,你最終會收到通知。您仍然必須從套接字讀取數據,並且通常每隔2小時發送一次Keepalive。儘管如此,這仍然比保持死亡插座好幾個月。