如何将n位完全写入UDP包c ++

时间:2014-03-04 22:37:07

标签: c++ udp

作为学习大学内容的一种方式,我决定开始使用UDP和新的线程内存模型在c ++ 11中编写网络库。这是我目前最大的障碍。

字节的大小是特定于平台的。 Memcpy 根据该平台上字节的大小进行复制和写入。那么我该如何制作与平台无关的代码来将完全 N 位写入我的UDP数据包? N通常是8的倍数,但我需要确保当我处理N个字节时,无论平台如何,都会修改相同数量的位。

我认为我最接近解决方案的方法是创建一个32位的基本结构,并以8的组的形式访问它。例如

struct Data
{
    char a : 8;
    char b : 8;
    char c : 8;
    char d : 8;
}

这样,我知道每个char将限制为8个字节。我的消息都是32的倍数 - 这没问题(这个结构在处理字节序时实际上会有帮助)。但是,我怎么能确定编译器不会将结构填充到平台的原生边界?这有用吗?

2 个答案:

答案 0 :(得分:1)

您的数据结构不足。 char类型被编译器定义为signed char(7个数据位,1个符号位),unsigned char(8个数据位)或char

发送数据包的大多数计算机使用unsigned charuint8_t作为八位字节。

另外,请注意多字节排序,称为Endianness。 Big endian是最重要的字节首先出现的地方;小端是最不重要的字节首先出现的地方。

许多消息传递方案将使用零填充剩余的位,使它们达到8位,16位或32位。

答案 1 :(得分:1)

您可能正在寻找#pragma pack(nopack)指令。正如有人指出的那样,你仍然会处理8位的倍数。

char应该总是正好1个字节,AFAIK虽然我可能错了。