gpt4 book ai didi

c++ - UDP 传输和维护网络字节顺序

转载 作者:太空宇宙 更新时间:2023-11-04 16:15:51 24 4
gpt4 key购买 nike

所以我在通过 C++ 中的客户端-服务器程序发送和接收自定义数据包时遇到了一些问题。我已经使用 TCP 实现了类似的东西,但是在使用 UDP 时将所有内容转换为单个数据报时遇到问题。

目前我的 header 由偶数个 uint32_t 字段组成。这些中的每一个都按照网络顺序存储在 header 结构中:

 uint32_t x = htonl (int y);

...

我将 header 与数据包中的有效负载组合在一起,如下所示:

 typedef struct {
450Header header; // 512 bytes consisting of the unint32_t like above
char data[ BLOCKSIZE ]; // 3.5k
// Total Packet Size = 4k
} Packet;

'

header 部分将包含有关数据包的信息,我的问题是如何处理字符串的字节顺序和有效负载。理想情况下,我想在标题中添加一些字符串字段,例如文件名,如果我发送的文件大于数据包中的 block 大小,我想将其拆分为多个数据包,我需要知道如何拆分文件,以便它可以在接收端以正确的顺序解释。

  1. 我已经成功地独立构建了一个 header (所有字段都按网络字节顺序排列),如果我将它们添加到 header 中,是否还需要转换字符串的顺序?我假设如果我将字符串保持在设定的大小,我仍然可以为 header 编写校验和函数。

  2. 如果问题 1 中的所有内容都正确排序,我是否需要在接收端再次将它们转换回主机顺序?

  3. 我有一个将文件加载到 char 缓冲区的 mmap 函数,我是否可以使用诸如 memcpy 之类的东西并增加偏移量来简单地将这段复制到 Packet 中的数据缓冲区?还是我还需要担心负载数据的网络顺序?

  4. 我需要对负载使用校验和吗?如果它没有使用整个缓冲区并以奇数字节结束,我该怎么办?

最终我希望 header 包含序列号,这样我就可以练习在数据包丢失时执行程序(即返回 N),所以我最担心的是标准化从客户端发送所有内容的顺序,以便它可以在服务器端以正确的顺序解释。

最佳答案

8 位数据(包括 8 位整数、Ansi/UTF-8 字符串等)不受字节顺序问题的影响,因此您可以按原样发送/接收它们。只有多字节数据(如 16 位/32 位整数、16 位 UCS2/UTF-16 字符串等)才需要处理字节顺序。例如,整数应始终采用网络字节顺序,但 UTF-16 字符串可以根据您的判断使用 UTF-16LE 或 UTF-16BE(尽管您应该改用 UTF-8)。

如果必须将数据拆分成多个包,则需要在包头中放置信息以指定包的顺序。 UDP 不保证数据包按发送顺序到达,甚至不保证它们完全到达。因此接收方需要收集数据包(根据需要请求丢失的数据包),然后在处理数据之前相应地重新排序。

是的,在发送数据包之前,您应该始终将数据包转换为网络字节顺序,并在接收端处理它们时转换回主机字节顺序。转换为网络字节顺序仅用于传输目的,以确保跨平台的格式一致。

校验和是确保每个数据包数据完整性的好主意,但这不是必需的。您当然可以为任意长度的数据提供固定长度的校验和,有很多校验和算法支持该功能。

关于c++ - UDP 传输和维护网络字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22822145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com