使用 UDP 套接字时,是否保证当 A 调用一次 send() 时,只要缓冲区足够大并且数据包成功传输(没有任何位翻转或数据丢失),整个数据包将在B 的另一边也只有一个 recv() 调用?
问问题
176 次
1 回答
2
是的。要么一个完整的数据报到达,要么什么都没有。
请注意,只阅读其中的一部分仍然会丢弃其余部分。
编辑:
更详细地说,当你调用send
一个 UDP 套接字时,你只发送一个数据报(它可能被分成几个数据包并在 IP、以太网或 ATM 等底层协议上重新组装)。这个数据报要么到达并通过校验和,要么没有。
如果一切顺利,您的接收缓冲区中就会有一个完整的数据报排队,您可以只recv
在一次。
调用recv
将从接收缓冲区中最旧的数据报复制数据,直到您指定(len
参数)的限制到您的应用程序缓冲区,然后丢弃数据报,即使它没有全部被读取。下一次调用recv
将读取不同的数据报(下一个最旧的)。
因此,您确实拥有严格的 1:1 关系。
于 2013-07-09T15:30:23.493 回答