2010-06-09 118 views
4

我寫了一個基於Twisted的服務器,而且我遇到了一個問題,有些客戶端連接不夠優雅。例如,用戶拔出網線。如何檢測Linux上扭曲的非正常斷開連接?

有一段時間,Windows上的客戶端斷開連接(connectionLost被調用,並且它也被寫入Twisted中)。而在Linux服務器端,我的連接失敗永遠不會被觸發。即使它試圖在連接丟失時將數據寫入客戶端。爲什麼Twisted在Linux上無法檢測到這些非優雅的斷開連接(甚至是將數據寫入客戶端)?如何使扭曲檢測非優雅斷線?由於Twisted功能無法檢測到非優雅,我的服務器上有很多殭屍用戶。

---- ----更新

我想這可能是類Unix系統的插座的功能,所以,什麼是插座上的行爲類似於Unix的處理情況也是這樣嗎?

謝謝。 Victor Lin。

回答

3

您正在描述不可靠網絡上TCP連接的行爲。 Twisted只是暴露了這種行爲:畢竟,當你使用Twisted建立TCP連接時,它只不過是一個TCP連接。

你說錯了,即使你試圖通過它發送數據,也不會調用connectionLost回調。兩分鐘後,底層TCP連接將消失,Twisted將通過調用connectionLost通知您。

如果您需要更快地檢測到這種情況,那麼您可以使用reactor.callLater來實現您自己的超時。

+0

你能解釋一下callLater如何用來檢測斷開連接嗎? – 2010-11-30 20:22:34

+1

它不會「檢測」斷開連接。您可以使用它來實施策略,在TCP斷開虛擬電路之前,您可以任意決定連接不再可用。您可以說,如果您在發送消息後的10秒內沒有收到任何回覆,則說明連接已中止。 callLater只讓你有能力在10秒後運行一個函數。如果你用這種方式處理問題,那麼你會編寫一個調用'loseConnection'並使用'c = reactor.callLater(10,thatFunction)'的函數。當你接收到數據時,你會'c.cancel()'。 – 2010-12-02 03:11:38

1

借用讓 - 保羅說的話,如果你需要更細粒度的TCP連接管理,只需使用reactor.CallLater。我們在Twisted/wxPython交易平臺上完全實現了該功能,並且它可以起到一定的作用。您可能還想調整ReconnectingClientFactory的行爲,以獲得我瞭解您的需求的結果。