Angenommen, die folgenden Code (der Einfachheit halber habe ich die notwendige Fehlerbehandlung hier weggelassen):Kann ich sicher sein, dass ein UDP recv sofort nach einem erfolgreichen Aufruf zum recv mit MSG_PEEK nicht blockiert wird?
recv(sockfd, NULL, 0, MSG_PEEK);
recv(sockfd, buff, bufflen, 0);
In diesem Fall: Kann ich sicher sein, dass nach dem ersten Aufruf zu recv
das gesamte Datagramm bereits empfangen und daher wird der zweite Anruf an recv
nicht blockieren?
Oder kann es passieren, dass, wenn IP das Datagramm aufteilt, die erste recv
zurückgibt, sobald ein Teil dieses Datagramms empfangen wird, und die zweite recv
wird blockiert, bis das gesamte Datagramm empfangen wird?
Wenn ich den ersten Anruf zu recv
mit substituieren:
recv(sockfd, NULL, 0, MSG_PEEK | MSG_TRUNC);
Kann ich sicher sein, dass dies nur einmal das gesamte Datagramm zurück empfangen wird, da sonst wäre es keine Möglichkeit für recv
zuverlässig die zurück Länge des gesamten Datagramms, wie von MSG_TRUNC
angefordert?
Nicht, wenn es einen anderen Prozess oder Thread mit einer FD für den gleichen Socket gibt. Es könnte das Paket vor Ihnen lesen. – Barmar