如何使用python脚本更改TCP Keepalive计时器?

How to change tcp keepalive timer using python script?

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

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

我的目标是要在5分钟内没有传输(*)的情况下关闭套接字连接。我正在Windows上工作,我的python脚本仅接收而不向客户端程序传输任何数据。

我所知道的是,默认情况下,如果2个小时内没有任何传输,那么只有我可以使用try和except关闭连接。我知道,对于Windows,我可以通过登录手动减少等待时间。但是,有什么方法可以从脚本中对其进行修改?

(*)此处的"无传输"表示"某些东西悄悄地吞噬了网络上的数据包",而不是"我不尝试发送任何内容。"


您可以使用setsockopt()在已经打开的套接字上设置TCP keepalive计时器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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源代码,似乎您需要像在Unix中那样用sock.setsockopt设置SO_KEEPALIVE和[可选地]用sock.ioctl设置SIO_KEEPALIVE_VALS


对于Windows,在python中:

这将使套接字保持活动状态,具有10秒的保持活动时间和3秒的保持活动间隔。

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

此处有更多详细信息