当使用UDP套接字时,是否保证当A调用send()一次时,如果缓冲区足够大并且数据包成功传输(没有任何位翻转或数据丢失),则整体数据包将在另一侧由B读取,同时也只有一次recv()调用?
答案 0 :(得分:2)
是。要么完整的数据报到达,要么什么都没有。
请注意,只阅读其中的一部分仍然会丢掉其余部分。
修改强>
更详细地说,当您在UDP套接字上调用send
时,您只发送一个数据报(可能会碎片化为多个数据包并在基础协议(如IP,以太网或ATM)上重新组合)。该数据报要么到达并通过校验和,要么没有
如果一切顺利,您在接收缓冲区中排队了一个完整的数据报,您可以recv
完全一次。
调用recv
会将接收缓冲区中最旧的数据报中的数据复制到应用程序缓冲区中指定的限制(len
参数),然后丢弃数据报,即使并非所有内容都被阅读过。下一次调用recv
将会读取不同的数据报(下一个最旧的)。
因此,你真的有一个严格的1:1关系。