Как изменить таймер TCP keepalive с помощью скрипта python?

в моем скрипте python я активировал TCP Keepalive с помощью этой команды:

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

моя цель состоит в том, чтобы соединение сокета было закрыто, если нет передачи(*) в течение 5 минут. Я работаю над Windows, и мой скрипт python только получает и не передает никаких данных в клиентскую программу.

что я знаю, по умолчанию, если передача не будет там в течение 2 часов, то только я могу закрыть соединение, используя try and except. Я знаю, для windows я могу вручную уменьшите это время ожидания, перейдя в registry. Но есть ли способ, которым я могу изменить его из своего сценария?

(*) здесь "нет передачи" означает "что-то тихо ест пакеты в сети", а не "я ничего не пытаюсь отправить."

3 ответов


Keepalive-это трюк протокола TCP для обнаружения мертвых соединений, например, для сервера Telnet. По умолчанию он выключен. Чтобы изменить keep alive таймеры использовать socket.setsockopt. См.https://docs.python.org/2/library/socket.html


вы можете установить таймеры TCP keepalive на уже открытый сокет с помощью 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_KEEPALIVE С sock.setsockopt аналогично в Unix и [необязательно?] set SIO_KEEPALIVE_VALS С sock.ioctl.


для windows, в python:

Это позволит сокету оставаться в живых, с 10 секундным временем и 3 секундным интервалом.

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

более подробная информация здесь