Cuando un send () no bloqueante solo transfiere datos parciales, ¿podemos asumir que devolverá a EWOULDBLOCK la próxima llamada?

Dos casos están bien documentados en las páginas de manual para sockets no bloqueantes:

Si send () devuelve la misma longitud que el búfer de transferencia,toda la transferencia finalizó con éxito, y el zócalo puede o no estar en estado de devolver EAGAIN / EWOULDBLOCK la próxima llamada con> 0 bytes para transferir.Si send () devuelve -1 y errno es EAGAIN / EWOULDBLOCK,ninguno de la transferencia finalizado, y el programa debe esperar hasta que el socket esté listo para más datos (EPOLLOUT en el caso de epoll).

Lo que no está documentado para los sockets sin bloqueo es:

Si send () devuelve un valor positivo más pequeño que el tamaño del búfer.

¿Es seguro asumir que el send () devolverá EAGAIN / EWOULDBLOCK en incluso un byte más de datos? ¿O debería un programa no bloqueador intentar enviar () una vez más para obtener un EAGAIN / EWOULDBLOCK concluyente? Me preocupa poner a un observador de EPOLLOUT en el zócalo si no está realmente en un estado de "bloqueo" para responder a lo que sale.

Obviamente, la última estrategia (intentar de nuevo obtener algo concluyente) tiene un comportamiento bien definido, pero es más detallado y da un golpe al rendimiento.

Respuestas a la pregunta(2)

Su respuesta a la pregunta