gpt4 book ai didi

c++ - 从 C 到 C++ 的数据包争论或...... Variant 和 Any 都不是 union

转载 作者:行者123 更新时间:2023-11-30 05:19:54 25 4
gpt4 key购买 nike

问题简而言之:我正在考虑为 UDP 协议(protocol)重写一些数据包处理代码……从 C 到 C++。显然,我可以只使用 C 中的结构来对数据建模,但这样做有什么意义呢?所以,为了论证,我们有:

struct { uint8:2 type; uint8:6 con_id; uint16 seq_num } packet_header;
struct { packet_header ph; uint16 command; } control_packet;
struct { packet_header ph; uchar8 data[DATASIZE]; } data_packet;

在这种情况下,“类型”为 0(数据)、1(控制)、2(加密数据)和 3(加密控制)。还会有表示每个控制数据包的结构,作为参数,我们可以说“打开”和“关闭”。

现在...我通常会有一个类型,获取数据包的函数返回,发送函数接受:

struct {
size_t pkt_len;
union {
uchar8 raw_packet[DATASIZE];
packet_header ph;
control_packet cp;
control_open_packet cop;
control_close_packet ccp;
data_packet dp;
} p;
} packet;

... 这一切都简化了参数... 但重点是:发送数据包时,我们要创建特定类型的数据包并发送通用数据包。相反,当接收数据包时,您希望接收通用数据包并在分类时将其转换为更具体的类型。

那么问题在哪里呢?我的问题是:如果 Variant 和 Any 不是表达这个的合适方式,那是什么?在这种情况下我是否坚持 union ?当然,我没有违反联盟的 POD 类型(到目前为止)的规定。我一直在搜索 C++11 和 Boost(并在某种程度上查看 C++14 ......虽然我坚持使用 C++11)但我没有看到提供的解决方案。

最佳答案

您可以像在您的示例中一样使用 union ,也可以使用带有 packet_header 的类层次结构作为每种类型数据包的顶级和特定派生类:

struct packet_header { uint8:2 type; uint8:6 con_id; uint16 seq_num };
struct control_packet : packet_header { uint16 command; };
struct data_packet: packet_header { uchar8 data[DATASIZE]; };

struct packet
{
size_t pkt_len;
union
{
uchar8 raw_packet[DATASIZE];
packet_header ph;
control_packet cp;
control_open_packet cop;
control_close_packet ccp;
data_packet dp;
};
};

也许您需要在处理数据包的代码中寻求优雅和灵 active 。我怀疑以其他方式(使用 boost 或使用 C++17 功能)定义数据是否会带来可观的 yield 。

注意 struct packet 中的匿名 union 。它允许直接访问特定数据包类型的字段。 C++ 风格要求结构名称紧跟在 struct 关键字之后。

关于c++ - 从 C 到 C++ 的数据包争论或...... Variant 和 Any 都不是 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40938438/

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