我正在编写一个与专有协议接口的服务器。 目前,大多数代码都包含解析数据包所有字段的数据包处理程序,同时确保可用数据的大小至少是每个字段后的最小剩余大小。除此之外,数据包处理程序还对接收到的数据进行有效性检查(即必须在一定范围内,或者在一组预定义值中)。
当你将它与数据包的实际逻辑处理结合起来时,这肯定是很多样板代码,因此我想自动生成解析器并在完全解析的结构上调用处理程序。
现在我看到我可以采取的两种方法:
想出一些元编程框架,它允许我描述数据包结构和最终的数据验证规则,这样我就可以在编译时生成解析代码。我想这与Boost.Spirit的意图类似。
编写我自己的数据描述语言和一个将从中生成C ++代码的外部工具。似乎并不太难,但肯定会使构建过程混乱,我通常不喜欢使用大量工具生成的代码。此外,这也不允许在源代码本身内快速更改数据描述。
元编程方式在理论上似乎更优越,但我还没有想到实现这一目标的完美方式。优选地,声明分组类似于声明类并且不会充满宏。在我必须引用以前的数据成员的情况下也存在一个问题(对于重复可变次数的字段,在数据包中较早指定计数的情况)。
有没有人有类似框架的经验,你会建议什么?
我知道谷歌协议缓冲区,但这是侵入性的,因为它需要控制协议。
答案 0 :(得分:1)
我过去曾经多次为二进制结构化数据创建自己的语言和工具,但这部分是由于需要从数据定义中支持多种目标语言(当时,C#和C ++);我还创建了第三个目标,从定义中生成HTML参考文档。
我在使用C ++模板元编程时可以看到的主要优点是,如果有用,您可以直接与编译时类型系统进行交互。但是,对于典型的二进制结构化数据,我从未发现它非常有用。例如,您需要一种以特定顺序处理相关成员的方法; Boost序列化通过要求一个序列化方法来指定处理哪些成员以及按什么顺序进行。