在C++中序列化/反序列化简单协议的最佳方法
Best way of serializing/deserializing a simple protocol in C++
我想在Linux上使用Berkeley套接字C++构建一个简单的应用程序协议。传输层应该是UDP,协议将包含以下两部分:
第一部分:
它是一个固定部分,是具有以下字段的协议标头:
1. int HeaderType
2. int TransactionID
3. unsigned char Source[4]
4. unsigned char Destination[4]
5. int numberoftlvs
第二部分
它将包含可变数量的 TLV,每个 TLV 将包含以下字段:
1. int type
2. int length
3. unsigned char *data "Variable length"
我的问题是准备通过网络发送的消息,进行序列化和反序列化的最佳方法是什么,以便在小端和大端等所有系统上可移植?
我是否应该准备一个大的"无符号字符"缓冲区,并开始将字段一个接一个地复制到其中?之后,只需调用发送命令?
如果我要遵循前面的方法,我如何继续跟踪指向复制字段的指针,我的猜测是为每个数据类型构建一个函数,该函数将知道要移动指针多少字节,对吗?
如果有人能为我提供一个解释得很好的例子,将不胜感激。
一些想法...排名不分先后...而且可能没有意义
- 你可以有一个缓冲区类。此类包含您撰写消息的原始内存指针,它可以包含计数器或指针来跟踪您写了多少、在哪里写以及你能走多远。
- 您可能希望每个线程读取/写入都有一个 Buffer 类实例。没有更多,因为您不希望周围有像这样的昂贵缓冲区。绑定到特定线程,因为您不想在没有锁定的情况下共享它们(并且锁定很昂贵) 您可能希望从一条消息
- 重用缓冲区到下一条消息,从而避免创建和销毁它的成本。
- 您可能想要探索装饰器的概念,该类继承或包含每个数据类。在这种情况下,他们的想法是这个装饰器包含序列化和反序列化每种数据类型的方法。
- 一种选择是使装饰器成为模板,并使用类模板专用化来提供不同的格式。
- 结合装饰器方法和缓冲区方法,您应该拥有所需的所有控件。
- 您可以在 Buffer 类中使用神奇的模板化方法,这些方法将任意对象作为参数,并自动为其创建装饰器并进行序列化。
- 相反,反序列化应该会给你一个装饰器,应该可以转换为装饰类型。
很抱歉,我现在没有时间给你一个完整的例子,但我希望上述想法能让你开始。
例如,
我无耻地插入了我自己的(反)序列化库,该库打包成msgpackv5格式:慌乱
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中向零方向近似的最佳方法
- 如何使用url确定网站协议
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 检测win32服务创建和删除的最佳方法
- 在reactor中存储eventHandlers的最佳方式是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 将Google协议缓冲区(protobuf)与Matlab结合使用的最佳方式
- 在C++中序列化/反序列化简单协议的最佳方法