消息包标头的设计模式

Design pattern for message packet header

本文关键字:设计模式 包标头 消息      更新时间:2023-10-16

我正在使用libevent编写自己的消息传递API。数据由包含数据字节数组的packet body和包含整个数据包大小信息的packet header的数据包结构封装(原因是在完整流处调用回调)。

class PacketHeader {
  size_t packet_size;
};
class Packet {
  PacketHeader header;
  uint8_t* body;
};

然而,我希望用户能够自定义他们自己的PacketHeader,同时我可以处理消息的底层大小信息。这样做的最佳做法是什么?我应该使用继承还是纯虚拟抽象(接口类)。我考虑了以下内容,但不确定这是否是最佳实践。

template <class Derived>
class PacketHeader{
  size_t packet_size;
  size_t header_size() const {return sizeof(Derived);}
}

为什么不让数据包自我描述,比如:

struct packet_header {
  int16_t size;   // size_t is too big
  uint8_t header; // header size
  uint8_t type;   // header type, some sort of id for header/message
};

然后,用户可以定义自己的标题类型和大小,一条消息的组成如下:

[  ][ ][ ]<--custom header-->[--body--]

因此custom header块是可选的,并且大小在分组报头中指定。然后允许用户特定的代码适当地解码报头。