EDIT:
En fait, la réception SIGPIPE
est presque "normal" pour les applications de connexion réseau.
Ceci est lié à la complexité des opérations réseau et à leur simultanéité. Par exemple, imaginez que l'autre côté a envoyé toutes ses données et a fermé la connexion. Sur votre machine, le socket doit toujours lire toutes les données de la mémoire (bien que l'envoi de données provoque une erreur) ...
... De plus, la boucle d'événement utilisée par noPoll peut recevoir des informations d'interrogation HUP
(déconnexion/raccrochage à distance) et placez-le dans la file d'attente. En même temps, votre code peut toujours être en cours d'exécution ou il peut être placé plus tôt dans la file d'attente d'événements. Ainsi, au moment où votre code est en cours d'exécution, les données de connexion n'ont pas encore été mises à jour.
Pour gérer SIGPIPE
dans votre application réseau (comme indiqué dans this question), vous devez ignorer le signal ou le gérer (si une action est requise).
personnes Normalement écrire dans:
signal(SIGPIPE, SIG_IGN);
Une autre approche pourrait utiliser l'appel mis à jour sigaction
système:
/* traitement du signal de configuration */ acte struct sigaction, vieux, old_term, old_pipe; sigemptyset (& act.sa_mask); act.sa_handler = SIG_IGN; si (sigaction (SIGPIPE, & acte, & ancienne_pipe)) { perror ("impossible de définir le gestionnaire de signal"); sortie (errno); };
Rappelez-vous d'inclure signal.h
#include <errno.h>
#include <signal.h>
En C++ la mise en œuvre peut être légèrement différent, mais cela devrait fonctionner pour les C et C++ (ou il semble donc de this question).
ORIGINAL:
Je ne suis pas sûr que je comprends votre question, mais si vous cherchez à tester si la connexion raw socket est correct, regardez dans le nopoll_conn_is_ok
function.
Si vous cherchez à gérer on_close
événements, que je ne peux pas aider avec ça - je ne pouvais pas trouver un gestionnaire d'événements on_close
dans le noPoll manual ... mais je suis sûr qu'il devrait être là quelque part. Sinon, regardez plutôt dans facil.io, que j'ai écrit pour les environnements Linux/BSD.
Je n'ai trouvé aucun gestionnaire d'événement 'on_close' dans le [manuel noPoll] (http://www.aspl.es/nopoll/html/group__nopoll__ctx.html) ... mais je suis sûr qu'il devrait être là quelque part. Sinon, regardez plutôt [facil.io] (http://facil.io), que j'ai écrit pour les environnements Linux/BSD. – Myst
P.S. 'noPoll' est une bibliothèque C, pourquoi la balise C++? – Myst
Avoir à se pencher sur cela, merci. –