recv mit MSG_NONBLOCK und MSG_WAITALL
Möchte ich recv
syscall mit nicht blockierende Flaggen MSG_NONBLOCK. Aber mit diesem flag syscall zurückkehren kann, bevor der vollständige Antrag ist zufrieden. So,
- kann ich hinzufügen flag MSG_WAITALL? Wird es nicht blockierender?
- oder wie muss ich das umschreiben blockiert recv in die Schleife mit nicht blockierenden recv
- Denke, Sie wollen Ersatz-Benutzer-Prozess-Speicher (Puffer unvollständige Nachricht), so das Sie verwenden möchten kernel-Speicher. Ich bezweifle, dass es funktionieren würde.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, was ich getan habe, das gleiche problem, aber ich möchte eine Bestätigung, dass dies funktioniert, wie erwartet...
EDIT:
Plain recv() zurück, was in den tcp-Puffer auf die Uhrzeit des Anrufs bis die angeforderte Anzahl von bytes. MSG_DONTWAIT nur vermeidet blockieren, wenn keine Daten vorhanden sind, überhaupt bereit zu sein, Lesen Sie auf den sockel. MSG_WAITALL Anfragen blockiert, bis die gesamte Anzahl der angeforderten bytes gelesen werden können. So dass Sie nicht "alle oder keiner" - Verhalten. Am besten sollte man EAGAIN, wenn keine Daten vorhanden sind und zu blockieren, bis die komplette Nachricht zur Verfügung stehen.
Könnten Sie in der Lage sein, um Mode etwas aus der MSG_PEEK-oder ioctl() mit einem FIONREAD (wenn Ihr system dies unterstützt), die verhält sich wie Sie wollen, aber ich bin nicht bewusst, wie Sie Ihr Ziel erreichen, die nur mit der recv () - flags.
Für IPv4-TCP erhält auf Linux-zumindest, MSG_WAITALL wird ignoriert, wenn MSG_NONBLOCK angegeben (oder ist der file-Deskriptor gesetzt, um non-blocking).
Vom tcp_recvmsg() in net/ipv4/tcp.c im Linux-kernel:
Ziel in dieser Besetzung festgelegt ist, um die angeforderte Größe, wenn MSG_DONTWAIT angegeben ist, oder den etwas kleineren Wert (mindestens 1), wenn nicht. Die Funktion wird abgeschlossen, wenn:
Mir das scheint, dass es möglicherweise ein Fehler in Linux, aber entweder Weg, es wird nicht so funktionieren, wie Sie wollen. Es sieht aus wie dec-vt100-Lösung wird, aber es eine race-condition, wenn Sie versuchen zu empfangen, die von der gleichen Steckdose in mehr als einem Prozess oder thread.
Das ist, anderen recv () - Aufruf durch einen anderen thread/Prozess auftreten konnte nach deinem thread ausgeführt hat, einen Blick, so dass Ihr thread block auf der zweiten recv().