如何使用Python脚本来改变TCP存活定时器?(How to change tcp keepali

2019-06-27 17:59发布

在我的Python脚本,我已经使用这个命令激活TCP保持连接:

x = s.setsockopt( socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

我的目标是套接字连接得到闭合,如果没有5分钟传输(*)。 我的工作在Windows和我的Python脚本只接收和任何数据不发送给客户端程序。

我所知道的是,在默认情况下,如果没有传递将在那里为2小时,然后只有我可以关闭使用try和除连接。 我知道,对于窗户,我可以手动对注册表减少这种等待时间。 但是,有没有一种方法,通过该,我可以从我的脚本修改呢?

(*),这里“不发送”是指“东西吃悄悄在网络上的数据包”,而不是“我不是想送东西。”

Answer 1:

存活是TCP协议特技检测死连接,例如用于Telnet服务器。 它默认是关闭的。 要改变永葆定时器使用socket.setsockopt 。 见https://docs.python.org/2/library/socket.html



Answer 2:

您可以设置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_KEEPALIVEsock.setsockopt类似于Unix和[可选?]集SIO_KEEPALIVE_VALSsock.ioctl



Answer 3:

对于Windows,蟒蛇:

这将使插座保持活动,以10秒的保活时间和3秒的保活间隔。

sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 10000, 3000))

更详细的信息在这里



文章来源: How to change tcp keepalive timer using python script?