数据包争吵从C到C ++或者...... Variant和Any都不是联盟
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据包争吵从C到C ++或者...... Variant和Any都不是联盟相关的知识,希望对你有一定的参考价值。
问题简而言之:我正在考虑重写UDP协议的一些数据包处理代码......从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;
在这种情况下,“type”对于数据为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不适合表达这个,那是什么?在这种情况下,我是否坚持工会?当然,我并没有违反工会的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;
};
};
也许您需要在处理数据包的代码中寻求优雅和灵活性。我怀疑以其他方式定义数据(使用boost或使用C ++ 17功能)将带来可观的收益。
请注意struct packet
中的匿名联盟。它允许直接访问特定数据包类型的字段。 C ++样式需要在struct
关键字之后直接使用结构的名称。
以上是关于数据包争吵从C到C ++或者...... Variant和Any都不是联盟的主要内容,如果未能解决你的问题,请参考以下文章
写了一个QT程序和一个C程序,如何把QT程序里发出的QByteArray类型数据,让C程序接收到或者是处理识别?