Python les Sockets en Gardant une connexion à un serveur en vie du client
Je suis actuellement en train de travailler avec python bibliothèque de socket pour la première fois et je ne suis pas très expérimenté avec les réseaux informatiques.
Je suis en mesure de vous connecter au serveur et la connexion tcp s'est passé tel que vu par wireshark. Après l'établissement d'une connexion au serveur(je n'ai pas de contrôle sur le serveur), la connexion reste ouverte pendant un certain temps, mais après un petit laps de temps, le serveur envoie une "FIN, ACK" et la fin de la connexion. J'essaie de comprendre comment je peux garder cette connexion en vie, tandis que le client est capable d'atteindre le serveur.
En regardant une connexion tcp, il semble un paquet peut être envoyé chaque tellement souvent. Peut-être une sorte de la garder vivante message. J'avais pensé à l'aide de socket.send('hello')
toutes les 5 secondes dans un autre thread serait de garder la connexion avec le serveur à l'ouvrir, mais j'ai toujours le "FIN, ACK" après un certain temps.
Dans la documentation, j'ai trouvé un setsockopt()
mais à l'aide de ce fait pas de différence notable. J'ai essayé client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
à la fois avant et après la connexion est établie. Je ne comprends pas complètement la façon dont cette méthode est censée fonctionner, donc peut-être que je l'ai utilisé de manière incorrecte. Il n'y a pas mention de cela. J'ai lu quelque part qu'elle était cassée sur windows. Je ne sais pas la vérité.
Ce qui me manque? La documentation pour les sockets ne semble pas avoir quelque chose à ce sujet, à moins que j'ai peut-être raté quelque chose.
import socket
import time
import threading
SERVER_IP = 'THE SERVER'
SERVER_PORT = SERVER_PORT
SOURCE_IP = socket.gethostname()
SOURCE_PORT = 57004
KEEP_ALIVE_INTERVAL = 5
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def keep_alive(interval):
data = 'hello'
while True:
client.send(data)
time.sleep(interval)
client.connect((SERVER_IP, SERVER_PORT))
t = threading.Thread(target=keep_alive, args = (KEEP_ALIVE_INTERVAL,))
t.start()
while True:
data = client.recv(1024)
if not data:
break
print data
client.close()
OriginalL'auteur God Usopp | 2016-08-12
Vous devez vous connecter pour publier un commentaire.
Pour l'activation de la garder vivante il y a une double question à Comment faire pour modifier tcp keepalive de la minuterie à l'aide d'un script python?
Garder à l'esprit certains serveurs et des serveurs proxy force fermer les connexions longue durée, indépendamment de garder avie utilisé ou non, dans ce cas, vous verrez une FIN,ACK après X quantité de temps n'importe quoi.
OriginalL'auteur danny