web-dev-qa-db-fra.com

Comment changer le temporisateur keepalive tcp 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 objectif est de fermer la connexion socket, 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, par défaut, si aucune transmission ne sera là pendant 2 heures, alors seulement je peux fermer la connexion en utilisant try et except. Je sais, pour Windows, je peux réduire manuellement ce temps d'attente en allant dans le registre. Mais existe-t-il un moyen de le modifier à partir de mon script?

(*) ici "pas de 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".

31
John

Vous pouvez définir les temporisateurs TCP keepalive sur un socket déjà ouvert 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 des options équivalentes sur windows voir msdn . En regardant à travers source Python , il semble que vous devez définir SO_KEEPALIVE avec sock.setsockopt similaire à sous Unix, et [éventuellement?] définissez SIO_KEEPALIVE_VALS avec sock.ioctl.

59
Will Pierce

Pour Windows, en python:

Cela permettra au socket de rester en vie, avec un temps de maintien de 10 secondes et un intervalle de maintien de 3 secondes.

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

Informations plus détaillées ici

11
Ayy