La respuesta está en otra sección de man 2 send
:
When the message does not fit into the send buffer of the socket,
send() normally blocks, unless the socket has been placed in nonblock‐
ing I/O mode. In nonblocking mode it would fail with the error EAGAIN
or EWOULDBLOCK in this case. The select(2) call may be used to deter‐
mine when it is possible to send more data.
O, alternativamente, la versión POSIX (man 3p send
):
If space is not available at the sending socket to hold the message to
be transmitted, and the socket file descriptor does not have O_NONBLOCK
set, send() shall block until space is available. If space is not
available at the sending socket to hold the message to be transmitted,
and the socket file descriptor does have O_NONBLOCK set, send() shall
fail. The select() and poll() functions can be used to determine when
it is possible to send more data.
Así, mientras que un read
de los datos parciales son comunes , no debe producirse un send
parcial en modo bloqueo (salvo detalles de implementación).
-1: Exactamente al revés: para cualquier protocolo basado en flujo (como TCP), el envío puede devolver menos de la cantidad solicitada, si el búfer local ya está casi lleno de envíos anteriores. Para protocolos de datagramas (como UDP), el envío fallará o enviará todo el buffer como un paquete, no es posible enviarlos parcialmente. –
No voté negativamente, pero veo mi respuesta, estás equivocado. –
@Kiril Kirov: usted y Chris Dodd son absolutamente correctos. Fart de mi parte, disculpas. He corregido mi respuesta. ¡Gracias! – paulsm4