表示网络数据包的C++类
C++ Class Representing Network Packet
我主要用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。通过网络直接从结构发送数据会经常导致不同平台之间的填充和/或字节序问题。
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- 为什么操作系统正在更改我的数据包的指定传出端口
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- recvfrom 只收到几个数据包,之后它进入等待状态
- 如何调试由 C++ 编写的 npm 数据包
- 如何在INET的应用层中发送广播数据包
- C++ 将字符串数据包转换为 iphdr语言 - 字符串数据包的格式应该是什么?
- 不同的数据包,联合 - 正确的用法\验证?