Assumer le code suivant (par souci de simplicité, j'ai omis l'erreur nécessaire manipulation ici):Puis-je être sûr qu'un recup UDP exécuté immédiatement après un appel réussi à recv avec MSG_PEEK ne bloquera pas?
recv(sockfd, NULL, 0, MSG_PEEK);
recv(sockfd, buff, bufflen, 0);
Dans ce cas: Puis-je être sûr que, après le premier appel à la recv
datagrammes tout est déjà reçu et donc le deuxième appel à recv
ne bloquera pas?
Ou peut-il arriver que si IP sépare le datagramme, le premier recv
retourne dès qu'une partie de ce datagramme est reçue, et le second recv
va bloquer jusqu'à ce que le datagramme entier soit reçu?
Si je remplace le premier appel à recv
avec:
recv(sockfd, NULL, 0, MSG_PEEK | MSG_TRUNC);
Puis-je être sûr que cela ne retournera une fois que le datagramme entier est reçu, car il serait par ailleurs aucun moyen pour recv
pour revenir de manière fiable la longueur du datagramme entier, comme demandé par MSG_TRUNC
?
Pas s'il existe un autre processus ou thread avec FD pour le même socket. Il pourrait lire le paquet avant vous. – Barmar