Подтвердить что ты не робот

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

В моем python script я активировал TCP Keepalive, используя следующую команду:

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Вы можете установить таймеры keepalive TCP в уже открытом сокете с помощью 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 socket module
    TCP_KEEPALIVE = 0x10
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
    sock.setsockopt(socket.IPPROTO_TCP, TCP_KEEPALIVE, interval_sec)

Для эквивалентных опций в окнах обратитесь к msdn. Просматривая источник Python, вам нужно установить SO_KEEPALIVE с помощью sock.setsockopt, аналогичного в Unix, и [опционально?] Установить SIO_KEEPALIVE_VALS с помощью sock.ioctl.

Ответ 3

Для окон, в python:

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

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

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