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".
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
.
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