Connexions TCP semi-ouvertes

· 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 dont le numéro de séquence est positionné à un de moins que le numéro de séquence courant pour la connexion. Un hôte qui reçoit l'un de ces ACK répond avec un ACK pour le numéro de séquence courant. Les keep-alives peuvent être utilisés pour vérifier 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 (par défaut 7 200 000 millisecondes, soit deux heures) si aucune autre donnée ou keep-alive de niveau supérieur n'a transité par la connexion TCP. S'il n'y a pas de réponse à un keep-alive, il est répété toutes les TCPKeepAlive.Interval secondes. KeepAliveInterval vaut par défaut 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). Depuis sgcWebSockets 4.3.7, tu peux activer 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;