Quand un send () non-bloquant ne transfère que des données partielles, pouvons-nous supposer qu'il renvoie EWOULDBLOCK au prochain appel?

Deux cas, ils sont bien documentées dans les pages de manuel pour les sockets non bloquant:

  • Si send() renvoie la même longueur que le tampon de transfert, l'ensemble du transfert terminé avec succès, et la prise peut ou peut ne pas être dans un état de retour EAGAIN/EWOULDBLOCK le prochain appel >0 octets à transférer.
  • Si send() renvoie -1 et errno est EAGAIN/EWOULDBLOCK, aucun transfert fini, et le programme doit attendre jusqu'à ce que le support est prêt pour plus de données (EPOLLOUT dans le epoll cas).

Ce n'est pas documentée pour les sockets nonblocking est:

  • Si send() renvoie une valeur positive plus petite que la taille de la mémoire tampon.

Est-il sûr de supposer que le send() serait de retour EAGAIN/EWOULDBLOCK même un octet de plus de données? Ou si un non-blocage de programme essayez d'envoyer() une fois de plus pour obtenir un concluante EAGAIN/EWOULDBLOCK? Je suis inquiet à propos de mettre un EPOLLOUT watcher sur la prise, si ce n'est pas vraiment dans un "bloquerait" état de répondre à sortir de.

Évidemment, la seconde stratégie (en essayant de nouveau pour obtenir quelque chose de concluant) a bien défini le comportement, mais c'est plus détaillé et met un coup sur la performance.

source d'informationauteur David Timothy Strauss | 2013-10-15