2011-05-24 61 views
0

假设我正在尝试使用udp套接字发送数据。如果数据很大,那么我认为数据将被分成几个数据包并发送到目的地。UDP数据包大小和fragements

在目的地,如果有多个传入数据包,那么如何将这些分离的数据包合并到原始数据包中?我是否需要一个数据结构来保存基于发件人的所有传入udp?在此先感谢..

回答

4

如果您只是简单地在一个数据报中发送数据,使用一个单一的send()调用,那么传输层将为您完成分段和重组。所有你需要做的就是给recv()提供一个足够大的缓冲区,如果所有的碎片已经到达,那么它们将被重新组合并作为单个数据报呈现给你。

基本上,这是UDP为您提供的服务(其中“数据报”是由单个send()呼叫发送的数据的一个单一的块):

  • 数据报可能无法在所有到达;
  • 数据报可能无序地到达其他数据报;
  • 该数据报可能不止一次到达;
  • 如果数据报确实到达,则它将是完整正确的。

但是,如果您正在执行将数据划分为多个UDP数据报的情况,那么在应用层,您当然也会负责重新组装它。


1.无论如何,校正UDP校验和隐含的概率。

+0

感谢您的回复。我想知道数据包是否来自多个源(发件人),那么我该如何处理?传输层也会自动处理这个问题(根据来源合并数据包)? – codereviewanskquestions 2011-05-25 00:53:36

+0

@LCYSoft:是的,来自不同来源的多个数据报或片段不会被接收器组合。 – caf 2011-05-25 01:17:51

0

您应该为此使用TCP。 TCP适用于需要以特定顺序到达而不被丢弃的结构化数据。

另一方面,当数据包在约500毫秒后变得不相关时使用UDP。这用于游戏,电话等等。

0

如果您的问题需要UDP,那么您需要自己处理任何丢失,重复或乱序的数据包,或者至少编写能够适应这种可能性的代码。

http://en.wikipedia.org/wiki/User_Datagram_Protocol

如果你不能丢失的数据包,那么TCP可能比UDP更好的选择,因为它提供了保证开箱。