<p>可以使用setsockopt()在已打开的套接字上设置TCP keepalive计时器。</p>
<pre><code>import socket
def set_keepalive_linux(sock, after_idle_sec=1, interval_sec=3, max_fails=5):
"""Set TCP keepalive on an open socket.
It activates after 1 second (after_idle_sec) of idleness,
then sends a keepalive ping once every 3 seconds (interval_sec),
and closes the connection after 5 failed ping (max_fails), or 15 seconds
"""
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, after_idle_sec)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, interval_sec)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, max_fails)
def set_keepalive_osx(sock, after_idle_sec=1, interval_sec=3, max_fails=5):
"""Set TCP keepalive on an open socket.
sends a keepalive ping once every 3 seconds (interval_sec)
"""
# scraped from /usr/include, not exported by python's socket module
TCP_KEEPALIVE = 0x10
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
sock.setsockopt(socket.IPPROTO_TCP, TCP_KEEPALIVE, interval_sec)
</code></pre>
<p>对于windows <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ee470551%28v=vs.85%29.aspx">refer to msdn</a>上的等效选项。
通过<a href="http://hg.python.org/cpython/file/dfe327390cc2/Modules/socketmodule.c#l3783">Python source</a>查看,似乎需要使用类似于Unix中的<code>sock.setsockopt</code>设置<code>SO_KEEPALIVE</code>,并且[可选地]?]用<code>sock.ioctl</code>设置<code>SIO_KEEPALIVE_VALS</code>。</p>