数据包争吵从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都不是联盟的主要内容,如果未能解决你的问题,请参考以下文章

用C/C++写一个小程序读取串口接收到的数据

c语言调用libzip库读zip文件

写了一个QT程序和一个C程序,如何把QT程序里发出的QByteArray类型数据,让C程序接收到或者是处理识别?

C语言数据读取

Socket: Java Client 与 C Server 传输数据中文乱码问题

Linux下如何抓指定IP的包