2012-09-03 26 views
21

En mi script en Python, he activar TCP Keepalive usando este comando:Cómo cambiar el temporizador keepalive de tcp usando la secuencia de comandos python?

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

Mi objetivo es para la conexión de tubo para quedar cerrada, si no hay transmisión (*) durante 5 minutos. Estoy trabajando en Windows y mi script python solo recibe y no transmite datos al programa cliente.

Lo que sé es, por defecto, si no hay transmisión estará allí durante 2 horas, entonces sólo puedo cerrar la conexión utilizando try y except. Lo sé, para Windows, puedo reducir manualmente este tiempo de espera yendo al registro. Pero, ¿hay alguna manera por la cual puedo modificarlo desde mi script?

(*) aquí "ninguna transmisión" significa "algo come en silencio paquetes en la red" en lugar de "yo no estoy tratando de enviar nada."

+0

aclaró lo que "no hay transmisión" significa. –

Respuesta

-5

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

+2

Tu respuesta es engañosa. –

+0

Absurdamente incorrecto –

+0

Incluso Windows tiene estas opciones http://msdn.microsoft.com/en-us/library/windows/desktop/ee470551(v=vs.85).aspx –

45

Es posible ajustar los temporizadores de mantenimiento de conexión TCP en un conector ya a abrir 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 las ventanas refer to msdn. Mirando a través del Python source, parece que necesita establecer SO_KEEPALIVE con sock.setsockopt similar a en Unix, y [¿opcionalmente?] Establecer SIO_KEEPALIVE_VALS con sock.ioctl.

+0

Tenga en cuenta que las constantes TCP_ * utilizadas aquí son específicas a Linux. Por ejemplo que no están disponibles en OS/X – RobM

+1

osx 'hombre tcp' contiene una opción' TCP_KEEPALIVE' que acepta segundos entre las sondas, que es equivalente a 'TCP_KEEPINTVL' en Linux. la opción no se exporta en Python 2.7 o 3.3, pero creo que es posible usar el valor entero correcto '0x10' como clave. –

+0

@DimaTisnek TCP_KEEPINTVL parece equivalente, pero ¿cómo obtuviste ese valor '0x10'? –

7

Para las ventanas, en python:

Este conector permitirá mantener con vida, con un tiempo de 10 segundos mantener vivo y un 3 segundos mantener intervalo vivo.

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

información más detallada here

Cuestiones relacionadas