【问题标题】:How to transfer different objects via tcp with different versions如何通过不同版本的tcp传输不同的对象
【发布时间】:2014-05-01 16:26:31
【问题描述】:

我需要序列化不同的对象(到消息)并通过 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];
};

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

【问题讨论】:

标签: c++ c++11 boost tcp


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2016-09-30
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2010-12-13
    相关资源
    最近更新 更多