在UDP中接收数据包

时间:2009-10-24 19:58:58

标签: c# c++ networking udp

假设我的程序通过网络(UDP)发送1000个字节。是否保证接收器将在一个“批处理”中接收1000个字节?或许他需要进行几次“阅读”,直到他收到整个信息?如果后者是真的,我如何确保同一消息的数据包顺序不会“混淆”(按顺序),或者协议可能保证呢?
编辑:也就是说,我的邮件是否可能被拆分为多个数据包? (如果我尝试发送10000mb消息,那么会发生什么?)

5 个答案:

答案 0 :(得分:13)

你会得到全部或全部。

但是没有特别保证您按照传输顺序只接收一次数据包;数据包丢失,重新排序和(不太常见)重复都是可能的。

最大帧大小(65,507字节),send()较大大小的数据包将返回错误。

您必须提供足够的缓冲区才能在一次通话中接收整个帧。

UDP数据包可以分段为多个IP分段,但操作系统会丢弃不完整的数据包。因此,这对应用程序是透明的。

答案 1 :(得分:4)

接收方将在一次通话中获得整个数据包。数据包长度有限,即使在theory

  

长度       一个16位字段,指定整个字节的长度   数据报:标题和数据。最低   长度是8个字节,因为那是   标题的长度。字段大小   设定理论上的极限为65,535   字节数(8字节标题+ 65527字节   数据)用于UDP数据报。该   数据长度的实际限制   这是由底层人施加的   IPv4协议是65,507字节。

然而,实际限制要低得多,假设512字节通常是安全的。请参阅What is the largest Safe UDP Packet Size on the Internet

答案 2 :(得分:1)

使用UDP发送的数据分组在packets中,因此如果您发送x个字节,那么如果接收方收到数据包,他将收到x个字节。

但是,您的数据包可能无法到达,或者它们可能无法到达。

答案 3 :(得分:1)

与TCP不同,UDP不是一种可靠的协议。它没有提供内置机制来确保数据包以正确的顺序到达,甚至根本不到达。也就是说,您可以以锁步方式编写send / recv例程,每次发送数据包时,发送方必须等待再次发送之前收到ACK。如果在某个指定的超时后未收到ACK,则必须重新发送该数据包。这样,您可以确保以正确的顺序接收数据包。 (有关更多信息,请查看使用此策略的RFC for the TFTP protocol。)

最后,如果可能,您可能需要考虑使用TCP。

答案 4 :(得分:1)

使用UDP Lite,您可以请求接收部分损坏的数据包。这对视频和VoIP服务非常有用。