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- Fermeture de l'application : lorsqu'un processus se termine, il envoie généralement un paquet FIN qui informe l'autre pair que la connexion a été fermée. Mais si un processus plante il n'y a pas de garantie que ce paquet sera envoyé à l'autre pair.
- Fermeture du périphérique : si le périphérique se ferme, il est très probable qu'il n'y aura aucune notification à ce sujet.
- Câble réseau débranché : si le câble réseau est débranché c'est la même chose que si un routeur se fermait, il n'y a aucune donnée transférée donc la connexion n'est pas fermée.
- Perte de signal du routeur : si l'application perd le signal du routeur, la connexion sera toujours active.
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 pairSi 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 TCPUn 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;
