Как изменить таймер 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?
(*) здесь "без передачи" означает "что-то тихо ест пакеты в сети", а не "я ничего не пытаюсь отправить".
Ответы
Ответ 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))
Более подробная информация здесь