2011-10-03 18 views
5

Estoy intentando crear un servidor de subproceso único en linux (red-hut) en C que escuche varios sockets.ERROR en aceptar: Recurso no disponible temporalmente

tengo que utilizar sockets no bloqueantes, cuando me puse las banderas para no bloquear la siguiente manera:

int flagss = fcntl(socketfds[j],F_GETFL,0); 
flagss |= O_NONBLOCK; 
fcntl(socketfds[j],F_SETFL,flagss); 

me sale:

ERROR on accept: Resource temporarily unavailable 

lo demás, todo funciona a la perfección.

Respuesta

12

El recurso que no está disponible temporalmente es EAGAIN y no es realmente un error. Significa "No tengo una respuesta para ti en este momento y me has dicho que no espere, así que aquí estoy volviendo sin respuesta".

Si configura un socket de escucha como no-bloqueante, como parece hacer, se supone que accept establece errno en ese valor cuando no hay clientes tratando de conectarse. Puede esperar la conexión entrante utilizando select (tradicional) o poll (interfaz semánticamente equivalente, más nueva, preferida a menos que deba ejecutar en algún antiguo Unix sin ella) o epoll (optimizado para miles de descriptores, específicos de Linux).

Por supuesto, utilizará poll (o cualquiera de las alternativas) para esperar los datos en el socket de escucha o en cualquiera de los sockets de datos.

+1

Gracias, he usado select y funciona – oznus

+1

Gracias por la explicación sobre el significado implícito! –

Cuestiones relacionadas