在我的Python脚本,我已经使用这个命令激活TCP保持连接:
x = s.setsockopt( socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
我的目标是套接字连接得到闭合,如果没有5分钟传输(*)。 我的工作在Windows和我的Python脚本只接收和任何数据不发送给客户端程序。
我所知道的是,在默认情况下,如果没有传递将在那里为2小时,然后只有我可以关闭使用try和除连接。 我知道,对于窗户,我可以手动对注册表减少这种等待时间。 但是,有没有一种方法,通过该,我可以从我的脚本修改呢?
(*),这里“不发送”是指“东西吃悄悄在网络上的数据包”,而不是“我不是想送东西。”
存活是TCP协议特技检测死连接,例如用于Telnet服务器。 它默认是关闭的。 要改变永葆定时器使用socket.setsockopt
。 见https://docs.python.org/2/library/socket.html
您可以设置TCP存活定时器在已开放使用套接字setsockopt的()。
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上的等效选项参考MSDN 。 通过寻找Python源代码 ,看来你需要设置SO_KEEPALIVE
与sock.setsockopt
类似于Unix和[可选?]集SIO_KEEPALIVE_VALS
与sock.ioctl
。
对于Windows,蟒蛇:
这将使插座保持活动,以10秒的保活时间和3秒的保活间隔。
sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 10000, 3000))
更详细的信息在这里