I’m running a Twisted server with the LineReceiver protocol. Sometimes clients will disconnect silently, so Twisted keeps the connection open. And because the server doesn’t send anything unless requested of it, there’s never a TCP timeout. In other words, some connections are never closed server-side.
How can I have Twisted close a connection that’s been inactive for a few hours?
You can schedule timed events using
reactor.callLater. Based on this, there’s a helper for adding timeouts to protocols,twisted.protocols.policies.TimeoutMixin.Another approach is to use TCP keep-alives, which you can enable using the transport’s
setTcpKeepAlivemethod.And another approach is to use application-level keep-alives. Essentially send a ”noop” once in a while. It doesn’t need a response. If the connection has been lost, the extra data in the send buffer will cause the TCP stack to eventually notice.
See also the FAQ entry.