2013-07-09 30 views
0

当使用UDP套接字时,是否保证当A调用send()一次,只要缓冲区足够大并且数据包能够成功传输(没有任何位翻转或数据丢失),那么在B的另一端读取数据包时,只有一个recv()调用?使用UDP保证等于send()和recv()调用

+0

可能的重复[是UDP包确保是完整的,实际意义上,如果交付?](http://stackoverflow.com/questions/15954813/is-a-udp-packet-guaranteed-to-be-完全实用的意义,如果交付) –

+0

我很确定UDP数据包传输的结果是“根本不保证” - 换句话说,您的应用程序将需要检查从大小到顺序和正确性的所有内容。 –

+0

@MatsPetersson谢谢,但这不是同一个问题。我很清楚这个数据包不需要是“正确”的事实,我只是想知道它是否能保证进入一个“批次”。 – cooky451

回答

2

是的。无论是完整的数据报到达还是没有。

请注意,只读取其中的一部分仍会丢掉其余部分。

编辑:
更精心,当你在一个UDP套接字调用send,你送出去只有一个数据包(可能被分割到多个数据包,并重新组装上底层协议,如IP,以太网或ATM) 。该数据报要么到达并通过校验和,要么不通过。
如果一切顺利,您的接收缓冲区中有一个完整的数据报排队,您可以在上执行recv,

调用recv会从最老的报文接收缓冲区到了极限,你指定(len参数)到您的应用程序缓冲区,复制数据,然后丢弃数据包,即使不是所有的已读。下一次拨打recv将读取不同的数据报(下一个最早的)。

因此,你确实有严格的1:1关系。

+0

谢谢,将在5分钟内或任何时间限制接受。 – cooky451

相关问题