Comment changer tcp keepalive timer en utilisant le script python?

dans mon script python, j'ai activé TCP Keepalive en utilisant cette commande:

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

mon but est que la connexion socket soit fermée, s'il n'y a pas de transmission(*) pendant 5 minutes. Je travaille sur Windows et mon script python ne reçoit et ne transmet aucune donnée au programme client.

ce que je sais, c'est que, par défaut, si aucune transmission ne sera là pendant 2 heures, alors seulement je peux fermer la connexion en utilisant try and except. Je sais, pour les fenêtres, je peux réduire manuellement ce temps d'attente en allant au registre. Mais y a-t-il un moyen de le modifier à partir de mon script?

(*) ici "aucune transmission" signifie "quelque chose mange tranquillement des paquets sur le réseau" plutôt que "je n'essaie pas d'envoyer quoi que ce soit."

23
demandé sur Dima Tisnek 2012-09-03 16:42:43

3 réponses

Keepalive est un truc de protocole TCP pour détecter les connexions mortes, par exemple pour un serveur Telnet. Il est désactivé par défaut. Pour changer de garder en vie les minuteries utiliser socket.setsockopt. Voir https://docs.python.org/2/library/socket.html

-6
répondu Maksym Polshcha 2014-07-08 15:46:49

vous pouvez définir les minuteries TCP keepalive sur une socket déjà ouverte en utilisant 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)

pour les options équivalentes sur windows consultez msdn. En regardant à travers les Python source, il semble que vous devez définir SO_KEEPALIVEsock.setsockopt similaire à Unix, et [optionnellement?] set SIO_KEEPALIVE_VALSsock.ioctl.

48
répondu Will Pierce 2016-06-17 03:22:03

Pour windows, en python:

cela va permettre à la socket de rester en vie, avec un intervalle de 10 secondes de garder en vie et de 3 secondes de garder en vie.

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

informations plus détaillées ici

8
répondu Ayy 2017-04-17 16:25:04