TsgcWebSocketClient | Déconnexions abandonnées

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

Raisons de déconnexion

 

Détecter les déconnexions semi-ouvertes

Vous pouvez essayer de détecter les déconnexions en utilisant les méthodes suivantes

Deuxième connexion

Vous pouvez essayer d'ouvrir une seconde connexion et tenter de vous connecter, mais cela présente quelques inconvénients : vous consommez davantage de ressources, créez de nouveaux threads, etc. De plus, si l'autre pair a redémarré, la seconde connexion fonctionnera mais la première ne fonctionnera pas.

Ping de l'autre pair

Si vous tentez d'envoyer un ping ou tout autre message avec une connexion semi-ouverte, vous constaterez qu'aucune erreur n'est générée.

 

Activer KeepAlive au niveau du socket TCP

Un paquet TCP keep-alive est simplement un ACK dont le numéro de séquence est défini à un de moins que le numéro de séquence actuel pour la connexion. Un hôte recevant l'un de ces ACK répond avec un ACK pour le numéro de séquence actuel. Les keep-alives peuvent être utilisés pour vérifier que l'ordinateur à l'extrémité distante d'une connexion est toujours disponible. Les keep-alives TCP peuvent être envoyés une fois toutes les TCPKeepAlive.Time (par défaut 7 200 000 millisecondes ou deux heures) si aucune autre donnée ou keep-alive de niveau supérieur n'a été transmis sur la connexion TCP. S'il n'y a pas de réponse à un keep-alive, il est répété une fois toutes les TCPKeepAlive.Interval secondes. KeepAliveInterval est par défaut à 1000 millisecondes.

 

Vous pouvez activer le KeepAlive par connexion et permettre au protocole TCP de vérifier si la connexion est active ou non. C'est la méthode préférée si vous souhaitez détecter les déconnexions inattendues (par exemple : lorsque vous débranchez un câble réseau).

 


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