Question

Quel est le moyen le plus simple de vérifier si un socket a été fermé du côté distant de la connexion? socket :: is_open () renvoie true même s'il est fermé côté distant (j'utilise boost :: asio :: ip :: tcp :: socket ) .

Je pourrais essayer de lire dans le flux et voir s'il y parvient, mais je devrais changer la logique de mon programme pour le faire fonctionner de cette façon (je ne veux pas que les données soient extraites du flux à ce point du chèque).

Était-ce utile?

La solution

Si la connexion a été correctement fermée par l'homologue, vous devez obtenir un EOF pendant la lecture. Sinon, je fais généralement un ping pour savoir si la connexion est vraiment active.

Autres conseils

Recherchez simplement l'erreur boost :: asio :: error :: eof dans votre gestionnaire async_receive . Cela signifie que la connexion a été fermée. C’est la seule façon de procéder.

Existe-t-il une fonction Boek Peek? La plupart des implémentations de socket ont un moyen de lire les données sans les retirer de la file d'attente, vous pouvez donc les relire plus tard. Cela semblerait satisfaire vos exigences.

Après avoir rapidement parcouru les docs asio, je n’ai pas pu trouver exactement ce à quoi je m'attendais, mais cela ne veut pas dire que ce n’est pas là.

Je suggérerais cette pour commencer.

Je pense qu'en général, une fois que vous ouvrez un socket, vous devriez commencer à le lire immédiatement et ne jamais cesser de le faire. De cette façon, vous pouvez faire en sorte que votre serveur ou client prenne en charge les protocoles synchrones et asynchrones. Dès que le client ferme la connexion, la lecture vous le dira.

Utiliser error_code permet de vérifier si le client est connecté ou non. Si la connexion aboutit, error_code error.value () renverra 0, sinon renverra une autre valeur. Vous pouvez également vérifier le message () à partir du code_erreur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top