Al usar sockets de bloqueo en Linux, ¿hay alguna razón para que send()
devuelva menos de lo solicitado, otro que un syscall send()
interrumpido pero parcialmente exitoso?¿Cuándo enviará() devolverá menos que el argumento de longitud?
Soy consciente de que posiblemente esta sea una implementación muy definida, y que probablemente sería muy peligroso confiar en ese comportamiento incluso sin controladores de señal instalados (y por lo tanto, razones para syscalls interrumpidos). Probablemente recorro la llamada de envío hasta que se complete; Sin embargo, si hubiera alguna palabra oficial sobre el asunto, podría evitar eso.
Why is it assumed that send may return with less than requested data transmitted on a blocking socket? era la misma pregunta, con resultados no concluyentes: llamadas al sistema interrumpidos se mencionan como ejemplo para un corto recuento de retorno, pero aún no está claro si un búfer TCP completa Enviar causaría un envío parcial o la send()
sería simplemente bloqueará hasta hay suficiente espacio en el búfer.
FWIW, la página man para 'send()' en mi cuadro Linux dice 'Cuando el mensaje no cabe en el búfer de envío del socket, send() normalmente bloquea, a menos que el socket se haya colocado en I no bloqueante Modo O En modo no bloqueante fallaría con el error EAGAIN o EWOULDBLOCK en este caso. No parece documentar que la función devuelva algo más que su argumento 'len' (o' -1' en caso de error). –
Las páginas man de Linux son notoriamente vagas. Es mucho mejor que revises la página en un sistema BSD. La sección VALORES DEVUELTOS documenta que solo devuelve la cantidad de caracteres enviados sin garantía de que sea igual al número solicitado. –