gpt4 book ai didi

c++ - 如何在使用 TCP 的序列化/反序列化中避免跨语言依赖?

转载 作者:可可西里 更新时间:2023-11-01 02:33:33 26 4
gpt4 key购买 nike

我需要创建与 C++ 客户端和 Python 服务器(已经启动)的 TCP 聊天,我在 C++ 类中有消息,例如

class Message{
public:
uint64 utc_time;
uint64 token;
string content;
};

我正在将此从客户端发送到服务器,在服务器上我有 utc_time 的优先级队列并且需要广播给其他人。我的问题是如何序列化它,使用哪种格式来避免对大小类型大小的任何跨语言依赖? (也许将来会有更多的元数据,所以需要有点通用)?谁能给我建议使用哪种格式进行序列化(或仅像字节一样刷新)?

class Persistent:
public:
Persistent(int sz):objSize(sz){}
void write(std::ostream& out)const{out.write((char*)this, objSize);}
void read(std::istream& in){in.read((char*)this, objSize);}
private:
int objSize;
};

我想到了在服务器上用 C++ 编写反序列化器并从 Python 调用的其他可能性(如果可能的话)。这个问题有什么优雅的解决方案吗?

最佳答案

如果您真的想跨语言和跨平台而不必担心消息在哪里结束,请查看 Google Protobuf 的组合和 ZeroMQ .

当使用常规套接字时,您首先会读取消息的大小(您会在前面加上这个),然后您会知道字节数组从哪里到哪里是一条完整的消息。

示例 protobuf + zmq 用法:

message Message {
optional uint64 utc_time = 1;
required uint64 token = 2;
optional string content = 3;
}

使用 protobuf 编译器生成 C++ 代码(或 ruby​​/python/等)。

在您的代码中使用它:

#include <Message.pb.h>

Message msg;
msg.set_token(1);
msg.set_content("Hello world");

使用 zmq 发送:

std::string serialized = msg.SerializeAsString();
zmq::message_t reply(serialized.size());
memcpy(reply.data(), serialized.data(), serialized.size());
zmq_socket.send(reply);

使用 zmq 接收它:

zmq::message_t request;
zmq_socket.recv(&request); // blocking
Message recv_msg;
recv_msg.ParseFromArray(request.data(), request.size());

关于c++ - 如何在使用 TCP 的序列化/反序列化中避免跨语言依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13713153/

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