2010-01-25 4 views
4

bien ..J'utilise un modèle typique de epoll + multithread pour gérer des sockets massives, c'est-à-dire, j'ai un thread appelé epollWorkThread qui utilise epoll_wait pour gérer i/o prises Bien qu'il y ait un événement EPOLLIN, recv() fera le travail et j'utilise le mode noblocking pour permettre un retour immédiat. Et recv() est en effet dans une boucle while (true). Tout va bien dans le temps initial (peut-être quelques heures ou peut-être minutes ou si j'ai des jours chanceux), je peux recevoir l'information. Mais un peu plus tard, recv() insiste pour retourner -1 avec errno = 107 (ENOTCONN). L'autre pair du transport est écrit en AS3 qui s'assure que le socket est connecté. Donc, je suis confus par le comportement de recv(). Merci d'avance et tout commentaire est apprécié!recv() avec errno = 107: (point de terminaison de transport connecté)

+0

Pas de réponse, car je ne sais pas ce qui se passe, mais essayez un moniteur réseau pour obtenir plus d'informations. J'utilise tcpdump ou wireshark, ce qui est plus pratique. Ne pas oublier de vérifier votre code pour voir si les corruptions pourraient avoir causé ce problème (valgrind). – stefaanv

+0

je vous remercie pour votre information. J'ai essayé tcpdump, mais j'ai échoué à savoir comment capturer les paquets. J'ai essayé "tcpdump -i eth0 'port myportnum'" mais il ne capturera pas anythin ... – iBacchus

+0

Êtes-vous sûr de eth0? Vérifiez avec "ip addr". Avez-vous essayé en tant que root? Peut-être que vous n'avez pas la bonne permission. Les paramètres sont corrects, bien que j'ajoute aussi -s0 et -wtrace.cap pour que je puisse l'afficher avec wireshark. – stefaanv

Répondre

3

Errno 107 signifie que le socket est et non connecté (plus). Plusieurs raisons peuvent expliquer cette situation. En supposant que vous avez raison et que les deux côtés de la connexion affirment que le socket est toujours ouvert, un routeur/commutateur intermédiaire peut avoir interrompu la connexion en raison d'un délai d'expiration. Le moyen le plus sûr d'éviter de telles choses est d'envoyer périodiquement un message «santé» ou «maintien en vie». (Ainsi, le routeur/commutateur intermédiaire accepte la connexion comme vivant ...) =

Questions connexes