2012-09-03 10 views
21

Nel mio script python, ho attivare TCP Keepalive utilizzare questo comando:Come cambiare il timer keepalive tcp usando lo script python?

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

Il mio obiettivo è per il collegamento dello zoccolo di ottenere chiuso, se non v'è alcuna trasmissione (*) per 5 minuti. Sto lavorando su Windows e il mio script python sta solo ricevendo e non trasmettendo alcun dato al programma client.

Quello che so è, per impostazione predefinita, se nessuna trasmissione sarà lì per 2 ore, quindi solo io posso chiudere la connessione usando try e tranne. Lo so, per Windows, posso ridurre manualmente questo tempo di attesa andando al registro. Ma c'è un modo in cui posso modificarlo dal mio script?

(*) qui "nessuna trasmissione" significa "qualcosa mangia tranquillamente i pacchetti sulla rete" anziché "Non sto tentando di inviare nulla".

+0

chiarito ciò che "nessuna trasmissione" si intende. –

risposta

-5

Keepalive è un trucco di protocollo TCP per rilevare connessioni non funzionanti, ad es. per un server Telnet. È spento per impostazione predefinita. Per cambiare i timer keep alive utilizzare socket.setsockopt. Vedi https://docs.python.org/2/library/socket.html

+2

La tua risposta è fuorviante. –

+0

Assurdamente errato –

+0

Anche windows ha queste opzioni http://msdn.microsoft.com/en-us/library/windows/desktop/ee470551(v=vs.85).aspx –

45

È possibile impostare i timer TCP keepalive su un socket già aperto utilizzando 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) 

Per opzioni equivalenti su windows refer to msdn. Guardando attraverso il Python source, sembra che sia necessario impostare SO_KEEPALIVE con sock.setsockopt simile a in Unix e [facoltativamente?] Impostare SIO_KEEPALIVE_VALS con sock.ioctl.

+0

Si noti che le costanti TCP_ * utilizzate qui sono specifiche a Linux. Ad esempio, non sono disponibili su OS/X – RobM

+1

osx 'man tcp' contiene un'opzione' TCP_KEEPALIVE' che accetta secondi tra le sonde, che è equivalente a 'TCP_KEEPINTVL' in linux. l'opzione non viene esportata in Python 2.7 o 3.3, ma penso che sia possibile usare il valore intero corretto '0x10' come chiave. –

+0

@DimaTisnek TCP_KEEPINTVL sembra equivalente, ma come hai ottenuto il valore '0x10'? –

7

Per Windows, in pitone:

Questa presa consentirà tenere vivo, con 10 tenere seconda volta vivo e 3 secondi tenere intervallo vivo.

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

informazioni più dettagliate here