Para IPv4 TCP recibe en Linux, al menos, MSG_WAITALL se ignora si MSG_NONBLOCK está especificado (o el descriptor de archivo está configurado como no bloqueante).
De tcp_recvmsg() en net/ipv4/tcp.c en el núcleo de Linux:
if (copied >= target && !sk->sk_backlog.tail)
break;
if (copied) {
if (sk->sk_err ||
sk->sk_state == TCP_CLOSE ||
(sk->sk_shutdown & RCV_SHUTDOWN) ||
!timeo ||
signal_pending(current))
break;
objetivo en este reparto se establece en al tamaño solicitado si no se especifica MSG_DONTWAIT o algún valor menor (al menos 1) si no. La función completará si:
- bytes suficientes han sido copiados
- Hay un error de socket
- El conector se haya cerrado o apagado
- Timeo se encuentra a 0 (socket se establece en no-bloqueo)
- Hay una señal pendiente para el proceso
para mí esto parece que puede ser un error en Linux, pero de cualquier manera no va a funcionar de la manera deseada. Parece que la solución de dec-vt100 lo hará, pero existe una condición de carrera si intentas recibir desde el mismo socket en más de un proceso o subproceso.
Es decir, otra llamada recv() por otro subproceso/proceso podría ocurrir después de que su subproceso ha realizado un vistazo, haciendo que su subproceso se bloquee en el segundo recv().
Supongo que quiere ahorrar memoria de proceso de usuario (para almacenar en búfer el mensaje incompleto), por lo que desea utilizar kernel-memory. Dudo que funcione. –