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."
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
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_KEEPALIVE
sock.setsockopt
similaire à Unix, et [optionnellement?] set SIO_KEEPALIVE_VALS
sock.ioctl
.