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

标签 python tcp keep-alive

在我的 python 脚本中,我使用这个命令激活了 TCP Keepalive:

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

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

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

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

最佳答案

您可以使用 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 ,看来你需要设置 SO_KEEPALIVEsock.setsockopt 类似于在 Unix 中,并且 [可选?] 设置 SIO_KEEPALIVE_VALSsock .ioctl.

关于python - 如何使用 python 脚本更改 tcp keepalive 计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12248132/

相关文章:

tcp - 空 UDP 和 TCP 数据包的大小?

delphi - 什么会导致套接字在每次 HTTP 事务后快速关闭?

python - 在 repl.it 上保持 Discord Bot 在线

javascript - keepAliveTimeout 和连接超时有什么区别。如何检查 header 中的 keepAliveTimeout?

php - PHP 和 Python 之间使用 XML-RPC 进行通信

python - tensorflow 2.0,模型.fit(): Your input ran out of data

python - Gnome applet 应该如何存储它的配置数据?

python - Jinja2 '-' 变量,bug?

linux - 网络套接字使用未反射(reflect)在 netstat 中

c - 非阻塞 tcp 套接字如何通知应用程序发送失败的数据包。