2011-05-09 14 views
5

Estoy programando un servidor y un cliente usando sockets no bloqueantes (fd_sets y select función) y una vez que el servidor cierra o cierra un socket de cliente, el cliente comienza a recibir una gran cantidad de basura hasta que se estrella .. me han advertido que cuando se trabaja con una toma de select() se convertiría legible cuando se dio por terminada la conexión, pero ¿cómo puedo saber enC Sockets: evitar basura cuando el socket está cerrado

if(FD_ISSET(socket, &read)) 
{ 
} 

si la causa es sólo datos regulares o el la conexión ha terminado?

¡Muchas gracias!

Respuesta

6

El conjunto de descriptores de archivos no le dirá si el socket está cerrado, solo que puede intentar leer de él. Cuando el extremo remoto cierra la conexión, el zócalo se volverá "legible". Cuando intente con recv(), el valor de retorno será 0 indicando que el socket está cerrado. Siempre revise sus valores de retorno.

+0

Gracias! Entonces, recv() devuelve 0 cuando el socket está cerrado? Jaja, eso fue tan obvio ... muchas gracias – Lucas

+0

@Lucas ¡Hola! Bienvenido a Stackoverflow. Si está satisfecho con la respuesta de Dave, se lo alienta a aceptarlo y tal vez a votarlo mejor. ¡Salud! – Calvin1602

+0

Gracias! Me registré y podré votar las respuestas tan pronto como reciba algunos puntos de representante – Lucas

0

Usted tendrá que utilizar poll lugar (también es más flexible porque no está obligado por el tamaño de FD_SET!)

struct poll p = {.fd = fd, .events = POLLHUP|POLLRDHUP}; 
Cuestiones relacionadas