2012-08-11 40 views
1

我使用LineReceiver協議運行Twisted服務器。有時候客戶端會靜靜地斷開連接,所以Twisted會保持連接的打開狀態。並且由於服務器除非請求它纔會發送任何內容,所以永遠不會有TCP超時。換句話說,一些連接永遠不會關閉服務器端。關閉Twisted中的非活動連接

我怎樣才能扭曲關閉連接數小時無效的連接?

回答

2

您可以使用reactor.callLater安排定時事件。基於此,有一個助手可以爲協議添加超時,twisted.protocols.policies.TimeoutMixin

另一種方法是使用TCP保持活動,您可以使用傳輸的setTcpKeepAlive方法啓用它。

而另一種方法是使用應用程序級保留。基本上偶爾發送一次''noop''。它不需要回應。如果連接丟失,發送緩衝區中的額外數據將最終導致TCP堆棧通知。請參閱FAQ entry

+0

我們可以將默認超時值更改爲另一個值嗎? – Andromida 2014-01-07 09:09:07

+0

哪個默認超時?您的操作系統可能允許您在全球範圍內配置TCP保持活動,但這可能不是一個好主意。 Twisted的TCP支持不會在TCP本身之上添加任何額外的超時邏輯。如果你想要這樣的邏輯,那就是'TimeoutMixin'和'reactor.callLater'的用途。 – 2014-01-07 13:10:39