gpt4 book ai didi

c++ - 在 C++ 中序列化/反序列化简单协议(protocol)的最佳方式

转载 作者:太空宇宙 更新时间:2023-11-04 09:39:38 24 4
gpt4 key购买 nike

我想在 Linux 上使用 C++ 中的 Berkeley 套接字构建一个简单的应用程序协议(protocol)。传输层应该是UDP,协议(protocol)会包含以下两部分:

第一部分:

它是一个固定的部分,它是带有以下字段的协议(protocol)Header:

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"

我的问题是准备通过网络发送的消息,进行序列化和反序列化的最佳方法是什么,以便在所有系统(如 little Endian 和 big Endian)上可移植?

我是否应该准备一个“unsigned char”的大缓冲区,然后开始将字段一个一个地复制到其中?然后调用send命令?

如果我要按照以前的方式,我如何才能继续跟踪指针到复制我的字段的位置,我的猜测是为每种数据类型构建一个函数,该函数将知道移动指针的字节数,正确?

如果有人能给我提供一个解释清楚的例子,我将不胜感激。

最佳答案

一些想法......没有特定的顺序......并且可能没有意义

  • 你可以有一个 Buffer 类。此类包含您正在编写消息的原始内存指针,它可以包含计数器或指针以跟踪您写了多少、写在哪里以及可以写多远。
  • 您可能希望每个读/写线程都拥有一个 Buffer 类实例。没有更多了,因为你不希望周围有这样昂贵的缓冲区。绑定(bind)到特定线程,因为您不想在没有锁定的情况下共享它们(并且锁定很昂贵)
  • 您可能希望从一个消息到下一个消息重复使用 Buffer,避免创建和销毁它的成本。
  • 您可能想探索 Decorator 的想法继承或包含每个数据类的类。在这种情况下,他们对这个装饰器的想法是包含序列化和反序列化每种数据类型的方法。
  • 一个选择是使装饰器成为模板并使用类模板特化来提供不同的格式。
  • 结合 Decorator 方法和 Buffer 方法,您应该拥有所需的所有控制。
  • 您可以在 Buffer 类中使用神奇的模板化方法,这些方法将任意对象作为参数并自动为其创建装饰器并进行序列化。
  • 相反,反序列化应该为您提供一个可以转换为装饰类型的装饰器。

很抱歉,我现在没有时间给你一个完整的例子,但我希望以上的想法可以帮助你开始。

关于c++ - 在 C++ 中序列化/反序列化简单协议(protocol)的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22817596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com