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 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;
