Je suis actuellement en train d'essayer de réparer un bogue dans un serveur proxy que j'ai écrit à propos de l'appel socket select(). J'utilise les bibliothèques Poco C++ (en utilisant SocketReactor) et le problème est en fait dans le code Poco qui peut être un bug mais je n'ai pas encore reçu de confirmation de leur part. Que se passe-t-il lorsqu'une connexion interrompt brusquement l'appel socket() renvoie immédiatement ce qui est ce que je crois qu'il est censé faire? Quoi qu'il en soit, il renvoie toutes les sockets déconnectées dans l'ensemble lisible des descripteurs de fichiers mais le problème est qu'une exception "Socket is not connected" est levée quand Poco essaye de déclencher le gestionnaire d'événement onReadable qui est où je mettrais le code occupe-toi de ça. Étant donné que l'exception est capturée silencieusement et que l'événement onReadable n'est jamais déclenché, l'appel select() continue à renvoyer immédiatement, ce qui entraîne une boucle infinie dans le SocketReactor. Je pensais modifier le code Poco afin que plutôt que d'attraper l'exception silencieusement, il déclenche un nouvel événement appelé onDisconnected ou quelque chose comme ça afin qu'un nettoyage puisse être effectué.Socket select() Gestion des déconnexions abruptes
Ma question est, existe-t-il des moyens élégants de déterminer si un socket s'est fermé anormalement en utilisant select()? Je pensais utiliser le message d'exception pour déterminer quand cela s'est produit mais cela me semble sale.
Avez-vous enregistré des gestionnaires pour l'événement ErrorNotification? – nos
Oui, aucun événement d'erreur n'est déclenché. – Genesis
Je ne sais rien à propos de Poco, mais en général, select() ne signale aucune différenciation entre un socket lisible et un socket déconnecté. Il signale qu'un socket est lisible lorsqu'il est fermé/perdu/terminé. Une lecture ultérieure sur le socket indique alors si une déconnexion s'est produite et si elle était gracieuse ou anormale. Il semble que Poco détecte une déconnexion anormale lors de la lecture du socket (sauf l'exception), mais au lieu de l'avaler et de revenir à select(), il devrait arrêter son traitement du socket à la place. Cela suggère définitivement un bug à l'intérieur de Poco pour moi. –