ERROR on accept: Ressource temporairement indisponible

J’essaie de créer un serveur mono-thread sous Linux (red-hut) en C qui écoutera plusieurs sockets.

J’ai besoin d’utiliser des sockets non bloquants, quand je mets les drapeaux sur non-blocage comme ceci:

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

Je reçois:

 ERROR on accept: Resource temporarily unavailable 

Sinon, tout fonctionne parfaitement.

La ressource temporairement indisponible est EAGAIN et ce n’est pas vraiment une erreur. Cela signifie “Je n’ai pas de réponse pour vous en ce moment et vous m’avez dit de ne pas attendre, alors je reviens sans réponse.”

Si vous définissez un socket d’écoute comme non bloquant comme vous semblez le faire, accept est censé définir errno avec cette valeur lorsqu’il n’y a pas de client essayant de se connecter. Vous pouvez attendre la connexion entrante en utilisant select (traditionnelle) ou poll (sémantiquement équivalente, interface plus récente, préférée sauf si vous devez exécuter un ancien unix sans elle) ou epoll (optimisé pour des milliers de descripteurs, spécifique à Linux).

Bien sûr, vous utiliserez poll (ou l’une des alternatives) pour attendre des données sur le socket d’écoute ou l’un des sockets de données.