【发布时间】:2013-12-01 15:35:42
【问题描述】:
标题可能最能说明问题。
无论如何,我有一个从另一个源接收的数据缓冲区,我想在一个包含序列号(作为第一个字节)的单个 UDP 数据包中发送它 -> 我想将序列号添加到给定的缓冲!
我不想分配一个新的缓冲区,而是将其大小设置为 size+4,将序列号设置为第一个字节并将数据复制到缓冲区中,我想只使用 WSA 的分散收集机制。
遗憾的是,没有 WSA 文档明确指定 WSASend 保证所有缓冲区都将发送一个数据包(数据包大小将保持为
我可以确定它会以这种方式工作吗?还是我应该重新构建数据包?
最好, 丹尼尔
【问题讨论】:
-
如果 UDP 可以对消息进行分段,那么就不可能接收它们,因为它们可能会完全乱码。
-
@usr:但是 UDP(或者更确切地说是 IP)可以分段消息。最好不要这样做,因为它会放大丢包的影响,但它肯定是可能的。 UDP 可以并且将使用 1500 字节(或类似大小)的片段发送最多 65535-40 字节的任何数据报。
-
您永远不会从您的操作系统收到部分 UDP 消息。如果这是可能的,那么所有内容最终都可能会出现乱码,因为后面的片段可能会在更早的片段之后到达(因为 UDP 缺乏排序)。这将允许任何消息被打乱成任何可能的排列。不可能的。;我认为使用了 IP 分片,以便分片对 UDP 是透明的。不确定,没关系。操作系统保证您完整的 UDP 消息。
-
@usr 你错了。 UDP 数据包可以被 IP 层以正确的顺序分段和重组。每个片段都有足够的信息来做到这一点。在 UDP 中不会发生的是重新传输丢失的片段,这会导致整个数据报完全丢失。
-
@EJP 我并不是说它们没有碎片化和重组。这就是我要说的:碎片对于接收数据包的应用程序是透明的。您永远不会收到部分数据包。