Für IPv4 TCP zumindest unter Linux empfängt, wird MSG_WAITALL wenn MSG_NONBLOCK ignoriert wird angegeben (oder der Dateideskriptor ist auf nicht blockierend gesetzt).
Von tcp_recvmsg() in net/ipv4/tcp.c im Linux-Kernel:
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;
Ziel in dieser Besetzung wird auf auf die gewünschte Größe, wenn MSG_DONTWAIT angegeben ist oder einem kleineren Wert (zumindest 1) wenn nicht. Die Funktion wird abgeschlossen, wenn:
- genug Bytes kopiert wurden
- Es gibt einen Socket-Fehler
- der Socket geschlossen wurde oder Abschaltung
- timeo 0 (Buchse nicht blockierend eingestellt ist)
- es gibt ein Signal für den Prozess, um mich
dies scheint es wie ein Fehler in Linux sein kann, aber so oder so anhängige es, wie Sie wollen nicht arbeiten. Es sieht aus wie dec-vt100's Lösung, aber es gibt eine Race-Bedingung, wenn Sie versuchen, von demselben Socket in mehr als einem Prozess oder Thread zu empfangen.
Das heißt, ein anderer recv() -Aufruf durch einen anderen Thread/Prozess kann auftreten, nachdem der Thread einen Peek ausgeführt hat, was dazu führt, dass der Thread auf der zweiten recv() blockiert wird.
Denken Sie, Sie wollen Benutzer-Prozess-Speicher (um die unvollständige Nachricht zu puffern), so dass Sie Kernel-Speicher verwenden möchten. Ich bezweifle, dass es funktionieren würde. –