python tcp keep-alive

¿Cómo cambiar el temporizador tcp keepalive usando el script de python?



keep-alive (3)

En mi script de python, he activado TCP Keepalive usando este comando:

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

Mi objetivo es que la conexión del zócalo se cierre, si no hay transmisión (*) durante 5 minutos. Estoy trabajando en Windows y mi script de python solo recibe y no transmite ningún dato al programa cliente.

Lo que sé es que, de forma predeterminada, si no habrá transmisión durante 2 horas, solo puedo cerrar la conexión con intentar y excepto. Lo sé, para Windows, puedo reducir manualmente este tiempo de espera yendo al registro. Pero, ¿hay alguna manera de modificarlo desde mi script?

(*) aquí "sin transmisión" significa "algo come silenciosamente paquetes en la red" en lugar de "No estoy tratando de enviar nada".


Keepalive es un truco del protocolo TCP para detectar conexiones muertas, por ejemplo, para un servidor Telnet. Está apagado por defecto. Para cambiar los temporizadores de mantener el uso de socket.setsockopt . Consulte https://docs.python.org/2/library/socket.html


Para ventanas, en python:

Esto permitirá que el socket mantenga vivo, con un tiempo de mantenimiento de 10 segundos y un intervalo de mantenimiento de 3 segundos.

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

Información más detallada here


Puede configurar los temporizadores de keepalive TCP en un socket ya abierto usando 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)

Para opciones equivalentes en windows refiérase a msdn . Mirando a través de la fuente de Python , parece que necesita configurar SO_KEEPALIVE con sock.setsockopt similar a en Unix, y [opcionalmente] establecer SIO_KEEPALIVE_VALS con sock.ioctl .