2017-10-07 2 views
0

Longue histoire courte. J'ai fait un serveur Websocket avec noPoll.nopoll perdu connexion découverte

Il semble qu'il n'y ait aucun moyen de détecter une perte de connexion. Toutes les fonctions qui devraient dire nopoll_conn connexion en vie disent que la connexion est bonne. Toutefois, si vous souhaitez utiliser cette connexion, une erreur se produit, SIGPIPE.

Cela ne devrait pas être la bonne façon de découvrir que le client a pendu, non?

Ai-je perdu quelque chose? en attendant le boost 1.66 je suis coincé avec ça.

concernant

ap

EDIT:

nopoll_conn_is_ok(conn) dit que la connexion est bonne et vivante et l'écriture de jet à la prise de produit faute seg, SIGPIPE. Pour certaines raisons.

+0

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

+0

P.S. 'noPoll' est une bibliothèque C, pourquoi la balise C++? – Myst

+0

Avoir à se pencher sur cela, merci. –

Répondre

0

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.