【问题标题】:C# How to split UDP packets?C#如何拆分UDP数据包?
【发布时间】:2011-04-07 21:46:49
【问题描述】:

我正在使用 UdpClient 类发送数据包。

似乎每个数据包都有大小限制,因为大数据包永远不会到达目的地。我试图降低数据包的大小,以允许数据包到达目的地。我在某处读到“标准”数据包大小限制为 512 字节。

但我仍然需要发送大于 512 字节的对象。

所以我的问题是:.NET 中是否有内置方法可以将字节数组拆分为更小的数据包。显然,我之后也需要重新组装拆分的数据包。 p>

我在Socket类中看到了SendFile方法,我猜应该可以自动拆分大文件。但该方法不允许字节数组输入(仅文件名)。所以它只适用于发送存储在硬盘上的数据,而不适用于内存中的数据。

【问题讨论】:

  • 通过 UDP 发送一大块数据似乎有点奇怪,因为使用 UDP 不能保证数据报到达另一端。即使它们都到达了,也不能保证它们是原始顺序。您确定要使用 UDP 吗?
  • 这是一个视频游戏。我已经使用 UDP 进行输入和游戏状态传输。但我认为你是对的,也许 TCP 连接更适合发送地图,因为这些确实需要安全传输。
  • “我在某处读到标准数据包大小限制为 512 字节。”你的来源是错误的,以太网的帧大小大约是这个的三倍。

标签: c# udp split packet


【解决方案1】:

Socket类中的Send函数以字节数组为参数。

http://msdn.microsoft.com/en-us/library/w93yy28a.aspx

你可以试试这个。

【讨论】:

  • Send 方法将字节数组作为单个数据包发送。因此,字节数组不能大于 512 字节。这是我的问题的根源。
  • 您可以循环遍历字节数组,一次只发送 512 个字节。最后一个数据包显然包含 512 或更少。您可能需要将数据包编号放入您发送的数据包中,以便您可以按照正确的顺序重新组装它们。除此之外,大多数发送数据的方法看起来都只发送一个字节数组。
【解决方案2】:

通过 UDP 发送一大块数据似乎有点奇怪,因为使用 UDP 并不能保证数据报到达另一端。即使它们都到货了,也不能保证它们是原始顺序。确定要使用 UDP 吗?

Ciaran Keating 是对的。 TCP 是我需要的更好选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2011-05-31
    相关资源
    最近更新 更多