Traitement correct de EWOULDBLOCK avec interrogation sur une socket non bloquante

Je travaille sur un démon TCP d’interrogation depuis un certain temps maintenant. Récemment, j’ai lu que des sockets non bloquants peuvent parfois générer une erreur EWOULDBLOCK lors d’un send () ou d’un recv (). Je crois comprendre que si recv () lance un EWOULDBLOCK, cela signifie (généralement) qu’il n’ya rien à recevoir. Mais ce que je ne sais pas, c’est dans quelles circonstances send () lancerait un EWOULDBLOCK, et quelle serait la procédure appropriée pour gérer un tel événement?

Si send () lève un EWOULDBLOCK, le démon devrait-il simplement passer de cet événement à l’autre? En utilisant une interface de polling comme epoll, un nouvel événement sera-t-il déclenché lorsque le descripteur sera prêt à être écrit?

ce sur quoi je ne sais pas, c’est dans quelles circonstances send () lancerait un EWOULDBLOCK

Lorsque la mémoire tampon d’envoi (généralement détenue par le système d’exploitation, mais de toute façon quelque part dans la stack TCP / IP) est pleine et que la contrepartie n’a pas encore accusé réception des bits qui lui ont été envoyés depuis la mémoire tampon tout dans la mémoire tampon au cas où un renvoi serait nécessaire).

Quelle serait la procédure appropriée pour gérer un tel événement?

D’une manière ou d’une autre, vous devez attendre que la contrepartie accuse réception de certains des paquets qui lui sont envoyés, ce qui permet à la stack TCP / IP de libérer de l’espace pour davantage “d’envoi”. Epoll à la fois classique et plus moderne (et dans d’autres systèmes d’exploitation, kqueue & c) fournit des moyens intelligents d’effectuer cette attente (que vous attendiez de lire quelque chose, d’écrire quelque chose ou de “quel que soit le premier kqueue qui se produit”). Oui, les descripteurs observés se préparant (que ce soit pour la lecture ou l’écriture) sont la raison typique des événements epoll !