假設下面的代碼(爲簡單起見,我省略了必要的錯誤處理):我可以確定在成功調用recv與MSG_PEEK後立即執行的UDP recv不會被阻止嗎?
recv(sockfd, NULL, 0, MSG_PEEK);
recv(sockfd, buff, bufflen, 0);
在這種情況下,我可以肯定的是,第一次調用recv
後整個數據報已經收到並因此第二個電話recv
不會阻止?
或者它可以發生,如果IP拆分數據報,第一recv
回報,只要該數據報的任何部分被接收,而第二recv
將阻塞,直到接收到整個數據報?
如果我第一次調用替換到recv
有:
recv(sockfd, NULL, 0, MSG_PEEK | MSG_TRUNC);
我可以肯定地說,這隻會一次返回整個數據報被接收,因爲否則就沒有辦法爲recv
可靠地返回整個數據報的長度,按照MSG_TRUNC
的要求?
如果在同一個套接字上有FD的另一個進程或線程,則不應該。在你做之前它可以讀取數據包。 – Barmar