TCP kann Pakete beliebig zusammenführen und teilen. Also, vorausgesetzt, ich tue, zum Beispiel, wie ein Anruf:Blockiert `recv` auf einem TCP-Socket, wenn ich mehr Daten anfordere, als sofort verfügbar sind?
`recv(sock, buf, 15, 0)`
Aber in diesem Augenblick nur 5
Bytes von Daten ist ab sofort verfügbar -
Will recv()
Block bis 15
Bytes von Daten zur Verfügung steht, oder wird Ich bekomme nur 5
Bytes?
ich gefragt bin, weil ich, wenn ich lesen kann, wissen möchten, zum Beispiel eine uint32_t
einfach auf diese Weise (i
unter der Annahme, eine Variable vom Typ ist uint32_t
):
if(recv(sock, &i, sizeof(uint32_t), 0) < sizeof(uint32_t)) {
/* error */
}
i = ntohl(i);
Oder muss ich eher haben, so etwas zu tun:
unsigned char buff[sizeof(uint32_t)];
ssize_t read_already = 0;
while(read_already != sizeof(uint32_t)) {
ssize_t read_now = recv(sock, buff, sizeof(uint32_t)-read_already, 0);
if(read_now == -1) {
/* error */
}
else {
read_already += read_now;
}
}
memcpy(&i, buff, sizeof(uint32_t));
i = ntohl(i);
letztere deutlich hässlicher und mühsamer ist, aber leider notwendig, wenn recv()
nicht blockiert, bis sie alle Daten im Fall angefordert erhält wird das Paket aufgeteilt.
Vielen Dank. Also, gibt es kein Entkommen vor der Hässlichkeit und Beschwerlichkeit meines zweiten Schnipsel? – gaazkam
'MSG_WAITALL' könnte Ihre Bedürfnisse erfüllen. Es gibt einen Fehler in Ihrem Code-Schnipsel (Sie haben den Mauszeiger nicht auf "buff" in Ihrer Frage angewendet). Siehe das von mir bereitgestellte Codebeispiel. – selbie