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

标签 c++ linux sockets serialization deserialization

我想在 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/

相关文章:

c++ - Unordered_map,检查滑动窗口中的阈值

c++ - 使用 multimap 在 C++ 中读取和打印包含超过 2 列的 csv 文件

linux - orientdb 连接无效的密码和用户名

linux - 在 TomCat 6.x 上启动 Apache Solr 4.x 时出错 : java.net.UnknownHostException: hostname: hostname: Name or service not known

c++ - PoDoFo 使用 eclipse 设置,链接器错误,对符号 'pthread_mutexattr_settype@@GLIBC_2.2.5' 的 undefined reference

java - 如何修复: Anylogic does not connect to Eclipse over Socket

c++ - 如果我在转换中丢失数据,我可以在 C++ 中引发异常吗?

java - 如何使用 QAndroidJniObject 在 Qt C++ 中使用原生 android webview

c++ - Windows,C++ : two connections on one server socket?

java - 使用纯 Java 与 SSH 服务器通信以进行文件访问