Как изменить таймер 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))
более подробная информация здесь