Avec les sockets C TCP, l’envoi peut-il renvoyer zéro?

Est-il possible que la fonction d’ send C send zéro lorsque vous utilisez des sockets TCP? La page de manuel indique simplement qu’elle renverra le nombre d’octets envoyés, mais je ne sais pas si elle renverra simplement -1 quand elle ne pourra pas envoyer de données.

Je suis à peu près certain que, même si la mémoire est profonde dans la nuit des temps, je l’ai déjà vu revenir à zéro auparavant, dans la situation de transferts de données massifs où l’autre extrémité ne suivait pas.

En mémoire, dans ce cas, les tampons de la stack TCP distante s’étaient remplis, la stack avait notifié à l’extrémité locale qu’elle devait attendre jusqu’à ce que de l’espace soit libéré et que les tampons locaux soient également remplis.

A ce stade, ce n’est pas techniquement une erreur (donc pas -1 retourné) mais aucune donnée n’a pu être acceptée par la stack locale.

Je ne suis pas tout à fait sûr que ce soit le cas maintenant, car la norme Posix actuelle semble indiquer qu’elle bloquera simplement dans ce cas (ou échouera si elle est configurée pour la non-blocage).

Cependant, je soupçonne que c’est un point discutable. Vous avez la possibilité qu’il renvoie moins d’octets que vous avez demandé d’envoyer et vous devez donc avoir du code en place pour gérer cela.

Et, comme ce sera à peu près la même logique qui gérera “un octet de moins que ce que vous avez demandé” et “‘ octets nuls ”, vous pouvez aussi supposer qu’elle peut renvoyer zéro.

Eh bien, il y a toujours le cas où vous indiquez zéro comme nombre d’octets à envoyer … Dans ce cas, “renvoyer le nombre d’octets envoyés” indiquerait qu’il doit renvoyer zéro octet.

Il est probablement préférable de traiter le cas de retour-zéro correctement de toute façon; ça ne peut pas faire mal, et ça pourrait aider.

La réponse à cette question pourrait bien dépendre de la mise en œuvre et donc varier en fonction du système d’exploitation.

Une situation où 0 serait attendu, lorsque vous demandez une transmission de 0 octet.

La page de manuel BSD indique:

Si aucun espace de messages n’est disponible sur le socket pour contenir le message à envoyer, alors send () se bloque normalement, sauf si le socket a été placé en mode E / S non bloquant.

La spécification Posix va plus loin et indique qu’en mode bloquant, toutes les données sont transférées, à moins qu’une interruption ne se produise.

Dans les deux cas, zéro ne peut être renvoyé à moins que le nombre fourni ne soit nul.

J’observe un retour zéro de send(2) sur un AF_UNIX type AF_UNIX ce moment.

Yepp, c’était dû au champ de size de valeur zéro.

Alors, JFYI.