Ich habe zwei Prozesse, die über ein Paar Sockets kommunizieren, die mit socketpair () und SOCK_SEQPACKET erstellt wurden. So:
%Vor%Wie ich es verstehe, sollte ich MSG_EOR in der msg_flags Mitglied von "struct msghdr" beim Empfangen eines SOCK_SEQPACKET-Datensatzes sehen. Ich setze MSG_EOR in sendmsg (), um sicher zu sein, dass der Datensatz MSG_EOR markiert ist, aber ich sehe es nicht, wenn ich in recvmsg () empfange. Ich habe sogar versucht, MSG_EOR in das msg_flags-Feld vor dem Senden des Datensatzes zu setzen, aber das machte überhaupt keinen Unterschied.
Ich denke, ich sollte MSG_EOR sehen, wenn die Aufzeichnung nicht durch z. ein Signal, aber ich nicht. Warum ist das so?
Ich habe meinen Sende- und Empfangscode unten eingefügt.
Danke, Jules
%Vor%Mit SOCK_SEQPACKET unix domain sockets ist die einzige Möglichkeit, die Nachricht abzubrechen, wenn der Puffer, den Sie recvmsg () geben, nicht groß genug ist (und in diesem Fall erhalten Sie MSG_TRUNC).
POSIX sagt, dass SOCK_SEQPACKET-Sockets MSG_EOR am Ende eines Datensatzes setzen müssen, Linux-Unix-Domain-Sockets jedoch nicht.
(Refs: POSIX 2008 2.10.10 sagt, dass SOCK_SEQPACKET Datensätze unterstützen muss, und 2.10.6 sagt, dass Datensatzgrenzen für den Empfänger über das Flag MSG_EOR sichtbar sind.)
Was ein 'Datensatz' für ein bestimmtes Protokoll bedeutet, ist die Definition der Implementierung.
Wenn Linux MSG_EOR für Unix-Domain-Sockets implementiert hat, denke ich, dass der einzig vernünftige Weg wäre, zu sagen, dass jedes Paket ein Datensatz für sich ist und daher immer MSG_EOR setzt (oder vielleicht immer wenn MSG_TRUNC gesetzt wird) es wäre sowieso nicht informativ.
Dafür ist MSG_EOR nicht da.
Denken Sie daran, dass die Sockets-API eine Abstraktion über eine Reihe von verschiedenen Protokollen ist, einschließlich UNIX-Dateisystem Sockets, Socketpairs, TCP, UDP und vielen verschiedenen Netzwerkprotokollen, einschließlich X.25 und einige völlig vergessene Protokolle.
MSG_EOR soll das Ende des Datensatzes signalisieren, wo dies für das zugrundeliegende Protokoll sinnvoll ist. I.e. Es ist eine Nachricht an die nächste Schicht weiterzugeben, dass "dies einen Datensatz vervollständigt". Dies kann sich beispielsweise auf das Puffern auswirken, was das Löschen eines Puffers verursacht. Aber wenn das Protokoll selbst kein Konzept eines "Datensatzes" hat, gibt es keinen Grund zu erwarten, dass das Flag propagiert wird.
Zweitens, wenn Sie SEQPACKET verwenden, müssen Sie die gesamte Nachricht gleichzeitig lesen. Wenn Sie nicht, wird der Rest verworfen. Das ist dokumentiert. Insbesondere ist MSG_EOR nicht ein Flag, um Ihnen zu sagen, dass dies der letzte Teil des Pakets ist.
Hinweis: Sie schreiben offensichtlich eine Nicht-SEQ-PACKET-Version für MacOS. Ich schlage vor, dass Sie die SEQPACKET-Version ablegen, da dies nur die Wartungs- und Codierungslast verdoppelt. SOCK_STREAM ist für alle Plattformen in Ordnung.