2009-10-13 8 views
0

J'ai un socket non bloquant actuellement abonné à:Losing octets sur un socket non bloquant contrôle epoll lorsque l'autre côté écrit et ferme

ev.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLRDHUP| EPOLLET; 

Il reçoit quelques EPOLLINs que je lis non bloquer jusqu'à EAGAIN et puis je reçois HUP & RDHUP, parfois avec quelques octets de plus à lire.

L'autre côté est juste:

send(socket,960_bytes_buffer) 
close(socket); 

J'ai essayé avec recv MSG_PEEK directement dans la boucle d'événement pour les EPOLLIN et dans le temps proche, et a reçu des données ajoutant qu'il ne reçoit pas 960 toujours, parfois seulement environ 480 octets.

Rendre le socket non bloquant ou mettre un sleep (1) dans le client entre l'envoi et la fermeture fonctionne bien.

Il me semble plus un problème de douilles non-bloquantes qu'epoll liées. Quelque chose de simple comme "nc -l -p port" reçoit la bonne quantité d'octets.

+0

Vérifiez-vous les événements pour les bits HUP avant de vérifier le bit IN? –

+0

Oui je le fais, et dans tous les cas, après un HUP je ferme() et avant la fermeture vérifier les données en attente –

+0

Comment vérifier les données en attente? –

Répondre

Questions connexes