数据包争吵从C到C ++或者...... Variant和Any都不是联盟

时间:2016-12-02 18:06:53

标签: c++ sockets c++11 boost

问题简而言之:我考虑重写一些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;

在这种情况下,"键入"数据为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)并且我没有看到提供的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以在示例或类层次结构中使用union,而export default Ember.Route.extend({ actions: { deleteUser: function(user) { var record = this.modelFor('user'); record.destroyRecord().then(() => { this.transitionTo('users'); }); }, } }); 是每种类型数据包的顶级和特定派生类:

packet_header

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

请注意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; }; }; 中的匿名联盟。它允许直接访问特定数据包类型的字段。 C ++样式需要在struct packet关键字后面直接使用结构名称。