假设下面的代码(为简单起见,我省略了必要的错误处理):我可以确定在成功调用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