在我的python脚本中,我使用以下命令激活TCP Keepalive:
x = s.setsockopt( socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
如果5分钟没有传输(*),我的目标是关闭套接字连接。我正在使用Windows,我的python脚本只接收并且不向客户端程序传输任何数据。
我所知道的是,默认情况下,如果2小时内没有传输,那么只有我可以使用try和except来关闭连接。我知道,对于Windows,我可以通过转到注册表来手动减少等待时间。但有没有办法,我可以从我的脚本修改它?
(*)这里“没有传输”意味着“某些东西在网络上悄悄地吃掉包装”而不是“我不想发送任何东西。”
答案 0 :(得分:53)
您可以使用setsockopt()在已打开的套接字上设置TCP keepalive定时器。
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)
对于Windows refer to msdn上的等效选项。
浏览Python source,您似乎需要将SO_KEEPALIVE
与sock.setsockopt
设置为类似于Unix,并[可选地?]将SIO_KEEPALIVE_VALS
设置为sock.ioctl
。< / p>
答案 1 :(得分:9)
对于windows,在python中:
这将使socket保持活动状态,保持活动时间为10秒,保持活动间隔为3秒。
sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 10000, 3000))
更详细的信息here
答案 2 :(得分:-7)
Keepalive是一种用于检测死连接的TCP协议技巧,例如:对于Telnet服务器。它默认是关闭的。要更改保持活动计时器,请使用socket.setsockopt
。见https://docs.python.org/2/library/socket.html