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

2024-05-22 23:48:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我的目标是,如果5分钟内没有传输(*),则关闭套接字连接。我在Windows上工作,python脚本只接收数据,不向客户端程序发送数据。

我知道的是,默认情况下,如果2小时内没有传输,那么只有我可以使用try and except关闭连接。我知道,对于windows,我可以通过登录来手动减少等待时间。但有没有办法,我可以修改它从我的脚本?

(*)这里的“无传输”是指“有东西在网络上悄悄地吃掉数据包”,而不是“我不想发送任何东西”


Tags: 命令脚本目标sowindowssocket发送数据tcp
2条回答

可以使用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查看,似乎需要使用类似于Unix中的sock.setsockopt设置SO_KEEPALIVE,并且[可选地]?]用sock.ioctl设置SIO_KEEPALIVE_VALS

对于windows,在python中:

这将使socket保持活动状态,保持活动状态的时间为10秒,保持活动状态的时间间隔为3秒。

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

更详细的信息here

相关问题 更多 >

    热门问题