2010-03-10 15 views
22

Sé que read() es una llamada de bloqueo a menos que haga que el socket no sea bloqueante. Así que espero que la llamada a read() que solicita 4K de datos devuelva un valor positivo (no de bytes leídos) o -1 en caso de error (posible restablecimiento de conexión por parte del cliente, etc.). Mi pregunta es: ¿puede leer() devolver '0' en cualquier ocasión?¿Puede la función read() en un socket conectado devolver cero bytes?

estoy manejando la lectura() de esta manera:

if ((readval = read(acceptfd, buf, sizeof(buf) - 1)) < 0) 
    { 

    } 
    else 
    { 
     buf[readval] = 0; 
     //Do some thing with data 
    } 

bombas este código si se lee() devuelven cero y sé cómo solucionarlo. Pero, ¿es posible que read() devuelva cero?

+0

¿Ha considerado leer la página * man *? – EJP

Respuesta

41

Cuando una conexión TCP está cerrada en un lado, read() en el otro lado devuelve 0 bytes.

+3

¿No debería la lectura devolver -1 con errno establecido en ECONNRESET? En realidad, es una condición de error, si el otro lado ha cerrado la conexión. ¿Deberíamos considerar el retorno de cero también como condición de error? – kumar

+6

+1 read() devuelve cero cuando la conexión está cerrada. –

+1

@kumar: devolver cero le permite determinar que se produjo un apagado ordenado, en lugar de un error real. –

Cuestiones relacionadas