如何使用python脚本更改tcp keepalive计时器?

Joh*_*ohn 30 python tcp keep-alive

在我的python脚本中,我使用以下命令激活TCP Keepalive:

x = s.setsockopt( socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
Run Code Online (Sandbox Code Playgroud)

如果5分钟没有传输(*),我的目标是关闭套接字连接.我正在使用Windows,我的python脚本只接收并且不向客户端程序传输任何数据.

据我所知,默认情况下,如果2小时内没有传输,那么只有我可以使用try和except来关闭连接.我知道,对于Windows,我可以通过转到注册表来手动减少等待时间.但有没有办法,我可以从我的脚本修改它?

(*)这里"没有传输"意味着"某些东西在网络上静静地吃包"而不是"我不想发送任何东西."

小智 60

您可以使用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)
Run Code Online (Sandbox Code Playgroud)

对于Windows上的等效选项,请参阅msdn.通过寻找Python源代码,看来你需要设置SO_KEEPALIVEsock.setsockopt类似于Unix和[可选?]设定SIO_KEEPALIVE_VALSsock.ioctl.

  • 请注意,此处使用的 TCP_* 常量特定于 Linux。例如,它们在 OS/X 上不可用 (2认同)

小智 12

对于Windows,在python中:

这将使套接字保持活动状态,保持活动时间为10秒,保持活动间隔为3秒.

sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 10000, 3000))
Run Code Online (Sandbox Code Playgroud)

更详细的信息在这里