- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题简而言之:我正在考虑为 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/
我是一名优秀的程序员,十分优秀!