2011-10-03 14 views
5

Sto provando a creare un server a thread singolo in linux (red-hut) in C che ascolterà più socket.ERRORE all'accettazione: risorsa temporaneamente non disponibile

ho bisogno di usare socket non bloccanti, quando ho impostato le bandiere di non-blocking in questo modo:

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

ottengo:

ERROR on accept: Resource temporarily unavailable 

Altrimenti tutto funziona perfettamente.

risposta

12

La risorsa temporaneamente non disponibile è EAGAIN e questo non è proprio un errore. Significa "Non ho una risposta per te adesso e mi hai detto di non aspettare, quindi eccomi di ritorno senza risposta".

Se si imposta un socket di ascolto su non-blocking come si sembra, accept deve impostare errno su quel valore quando non ci sono client che tentano di connettersi. È possibile attendere la connessione in entrata usando select (tradizionale) o poll (interfaccia semanticamente equivalente, più recente, preferibile a meno che non sia necessario eseguire su un vecchio unix senza di esso) o epoll (ottimizzato per migliaia di chiamate di sistema descrittive, specifiche di Linux).

Naturalmente si utilizzerà poll (o una qualsiasi delle alternative) per attendere i dati sul socket di ascolto o uno qualsiasi dei socket di dati.

+1

Grazie, ho selezionato select e funziona – oznus

+1

Grazie per la spiegazione sul significato implicito! –

Problemi correlati