表示网络数据包的C++类

C++ Class Representing Network Packet

本文关键字:C++ 数据包 网络 表示      更新时间:2023-10-16

我主要用C为嵌入式世界编程,最近我一直在用C++进行实验,我有了一个想法。这个问题涉及通过网络传输的数据。目前在C中,我做了一些类似于这个人为的例子(忽略包装):

typedef struct {
    time_t date;
    float value;
} Message1;       
typedef union {
    char raw[sizeof(Message1)];
    Message1 msg;
} Overlay;
int my_func(Message1* ptr)
{
    /* do stuff with stuff */
}

数据被放入Overlay.raw中,并通过msg进行检查(当然是关于字节序)。我可以在不使用结构的情况下在C++中执行类似的操作吗?

class Message1 {
    public:
        time_t date;
        float value;
        int my_func() { /* do stuff with stuff */ };
}
typedef union {
    char raw[sizeof(Message1)];
    Message1 msg;
}

我做了一些实验,据我所知,到目前为止,似乎是有效的。然而,我想了解更多关于C++如何在类中对齐内容的细节。比如,如果我在public节之后放一个private节,它会断吗?如果我使用继承呢?这是一件愚蠢的事吗?

您通常希望保持联合的简单性。构造、复制、分配或移动语义都不适用于它们;即使成员已经定义了功能。不过,将它们与复杂的数据类型一起使用通常不是一个好主意,因为您需要担心vtables、访问修改成员的位置等。然而,POD类基本上与C结构相同(C++结构也基本上与类相同)。

据我所知,除了POD类型的成员变量顺序之外,内存布局并不是C++标准的一部分。公共变量、受保护变量和私有变量可以放在不同的内存区域中。我认为继承的成员布局也是实现定义的。因此,任何依赖于布局的代码都是特定于平台/编译器的。成员通常按顺序排列,但同样,依赖布局(例如多重继承)通常不是一个好主意。显然,对齐仍然是平台/编译器定义的,但您可以使用alignas(T)(C++11)控制对齐。

此外,这可能只是样式偏好,但最好将并集用作显式类型。而不是typedef。

union pkt {
    char raw[sizeof(Message)]
    Message msg;
}

我根本看不出在这里使用联合的充分理由
使用带有字节数组的并集而不是对(char*)的结构指针的强制转换没有任何好处。

如果你想发送一个数据包,你不需要一个联合来访问数据。

typedef struct {
    time_t date;
    float value;
} Message1;   
void sendData(uin8_t *pData, int size)
{
  while (size--)
     sendByte(*pData++);
}
int main()
{
  Message1 myMessage;
  sendData( &myMessage, sizeof(myMessage) );
}

Btw。通过网络直接从结构发送数据会经常导致不同平台之间的填充和/或字节序问题。