c++ - 如何通过不同版本的tcp传输不同的对象

标签 c++ c++11 boost tcp

我需要序列化不同的对象(到消息)并通过 tcp 连接发送到服务器(客户端和服务器都是 C++)并且我不能使用 protobuf(只有 boost 库可用)。是否已经有算法或示例,或教程如何做到这一点(我需要考虑消息将要更改,新版本具有附加字段)。

class Message {
public:
   char type;
   char version;
};

class Register : public Message {
public:
   // version 1 of Register message
   string first_name;
   string last_name;
};

class Register : public Message {
public:
   // version 2 of Register message
   string first_name;
   string last_name;
   long salary;
};

class ChangeName : public Message {
public:
   // version 1 of ChangeName message 
   string first_name;
};


// this is going to be transmitted ower tcp (length + type + version + data) like array of bytes
class TransmissionMessage {
public:
   uint32_t length;
   char type;
   char version;
   char data[length];
};

目前我有用于传输的类,它具有包含消息类型、消息版本和长度的固定 header 和正文/正文是包含来自消息类的序列化字段的字符数组,客户端和服务器上的实现相同/),但我不确定这是最好的方法,还有更好的方法吗。

最佳答案

我只是想先说清楚一点。您不能通过向客户端发送数据包来实现功能(或附加字段)。 唯一的选择是让客户端的程序能够 self 修改并发送解释来自服务器的数据的代码,或者非常相似的选项并且很容易让客户端更新它的软件。

但我猜你不想像上面描述的那样把你的程序搞得一团糟。 为了使旧客户端与新版本兼容,您需要使服务器像客户端版本一样工作。 每次实现新功能或字​​段以及客户端使用旧版本时,您都需要复制通信方式(在发送前安排数据包的代码本身),并在服务器上以相同版本与它通信。

关于c++ - 如何通过不同版本的tcp传输不同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23411934/

相关文章:

c++ - 为派生类 move 构造函数

c++ - 检测圆括号,打开和关闭

c++ - 通过模板化引用传递 C++11 lambda

c++ - 使用模板转换特定类型的参数

c++ - 在 C++11 中匹配 "value"object""object"..` 形式的字符串中所有 `.. "的 :"value"

c++ - boost::mpl::integral_c 之类的模板可以注册到 Boost.Typeof 吗?

python - 从 Python 执行 C++ 代码时出现段错误——在 Mac OS 上使用 Boost.Python

c++ - 使用带有 CMake 和 Conan 的外部库的 undefined reference

c++ - 标准的 c++11 方法来删​​除一个类型的所有指针

javascript - 在 C++ 的 JScript 中调用 instanceof 运算符 (IDispatch/IDispatchEx)