TCP Half-Open Connections

· Fonctionnalités

Une fois la connexion établie, si aucun pair n'envoie de données, alors aucun paquet n'est envoyé sur le réseau. TCP est un protocole idle, donc il suppose que la connexion est active.

Raisons de déconnexion

Détecter les déconnexions semi-ouvertes 

Tu peux essayer de détecter les déconnexions en utilisant les méthodes suivantes 

Seconde connexion

Tu peux essayer d'ouvrir une seconde connexion et tenter de te connecter, mais cela présente des inconvénients, comme la consommation de plus de ressources, la création de nouveaux threads... et si l'autre pair a redémarré, la seconde connexion fonctionnera mais pas la première.

Pinguer l'autre pair

Si tu essaies d'envoyer un ping ou tout autre message sur une connexion semi-ouverte, tu verras que tu n'obtiens aucune erreur.

Activer KeepAlive au niveau du socket TCP

Un paquet keep-alive TCP est simplement un ACK avec le séquence number set to one less than le current séquence number pour la connexion. A host réception de one de these ACKs répond avec un ACK pour le numéro de séquence courant. Keep-alives peut être used to verify qu'un ordinateur à l'extrémité distante d'une connexion est toujours disponible. Les keep-alives TCP peuvent être envoyés toutes les TCPKeepAlive.Time (defaults to 7,200,000 milliseconds or two hours) si aucune autre donnée ou keep-alive de niveau supérieur ont été carried over the connexion TCP. S'il n'y a pas de réponse à un keep-alive, c'est repeated once every TCPKeepAlive.Interval secondes. KeepAliveInterval est par défaut de 1000 millisecondes.

Tu peux activer KeepAlive par connexion et autoriser le protocole TCP à vérifier si la connexion est active ou non. C'est la méthode préférée si tu veux détecter les déconnexions perdues (par exemple : lorsque tu débranches un câble réseau). From sgcWebSockets 4.3.7 tu peux enable la propriété TCPKeepAlive pour essayer de détecter ces connexions semi-ouvertes.

oClient := TsgcWebSocketClient.Create(nil);
oClient.TCPKeepAlive.Enabled := True;
oClient.TCPKeepAlive.Time := 3000;
oClient.TCPKeepAlive.Interval := 1000;