Befunden UDP -Sockets Daten in unterschiedliche Nachrichten oder lesen Sie in so vielen Daten wie möglich auf einmal?
Posted: 01 Feb 2025, 10:11
Nehmen wir an, ich habe eine Absenderanwendung und eine Empfängeranwendung, die über UDP kommuniziert. Zuerst sende ich diese 15 Bytes: < /p>
wickelt einen Anruf an ioctlsocket mit Fionread zurück, wobei die Daten im Empfangspuffer warten, und PendingSize mit der Anzahl der Bytes. Recv ruft recv auf, um diese Daten in einen Puffer zu lesen, den ich lesen kann. Wenn es zutreffend zurückgibt, antworte ich auf die Daten, die ich erhalten habe. < /P>
Hier ist meine Frage. Welche dieser Szenarien reflektiert genau, was in dieser Situation passieren würde? < /P>
Option a.
[*] gibt true zurück und zeigt eine ausstehende Größe von 30 Bytes an. Recv gibt mir die meldung [myheader] Hallo [myheader] world .
HasPendingData< /code> Gibt false zurück. Danke!
Code: Select all
[MYHEADER]hello< /code> < /p>
...Womer danach sende ich noch weitere 15 Bytes: < /p>
[MYHEADER]world< /code> < /p>
Jetzt höre ich in der Empfängeranwendung denselben Port mit einem UDP -Socket an, der an dieselbe Adresse gebunden ist. Nehmen wir an, beide Nachrichten sind seit dem letzten Mal eingetroffen (und in derselben Reihenfolge). Abfragen des Sockets für eingehende Daten jeden Frame: < /p>
uint32 PendingSize;
while (Socket->HasPendingData(PendingSize))
{
uint32 BytesRead;
uint8 MessageData[kMaxMessageSize];
if (Socket->Recv(MessageData, kMaxMessageSize, BytesRead))
{
// Do stuff here
// Will BytesRead be equal to PendingSize?
}
}
< /code>
HasPendingData
Hier ist meine Frage. Welche dieser Szenarien reflektiert genau, was in dieser Situation passieren würde? < /P>
Option a.
- gibt true zurück und zeigt eine ausstehende Größe von 15 Bytes an. Recv gibt mir die meldung [myheader] Hallo .
Code: Select all
HasPendingData
- gibt true zurück und zeigt eine ausstehende Größe von 15 Bytes an. Recv gibt mir die meldung [myheader] world .
Code: Select all
HasPendingData
- Gibt false zurück.
Code: Select all
HasPendingData
[*]
Code: Select all
HasPendingData
HasPendingData< /code> Gibt false zurück. Danke!