2009-05-22 5 views
0

Y at-il un moyen de vérifier si une socket s'est déconnectée sur l'extrémité distante sans select() en C? La raison pour laquelle je ne veux pas utiliser select() est que dans le cas où mes tampons sont pleins, il peut y avoir des données disponibles pour la lecture sur le socket que j'ignore intentionnellement et un select (readfds = [socket_fd ]) reviendrait toujours immédiatement me le faire savoir.Vérifiez si une socket est déconnectée en C, sans select()

Répondre

4

Si vous avez un appel de fonction read() bloquant sur le socket, et qu'il renvoie la valeur entière 0, cela signifie que la connexion socket est fermée.

while (n = read(sockfd, buffer, BUFFER_SIZE)) { 
    //use buffer contents 
} 

Cette boucle continuera pendant l'envoi des données à partir de l'autre extrémité.

1

Utilisez à la place poll(), en réglant events sur les choses qui vous intéressent et en vérifiant les résultats dans revents. FYI, vous pouvez appeler select() ou poll() sans nuire aux prises ou en changeant leurs tampons.

+1

J'ai quelques problèmes en utilisant poll() comme ça, revents ne contient jamais POLLHUP quand le socket raccroche, juste POLLIN qui ne peut pas être vrai. – unexist

+0

Voir http://www.greenend.org.uk/rjk/2001/06/poll.html pour quelques bonnes informations sur ce problème. – dwc

Questions connexes