其他分享
首页 > 其他分享> > c – 如何使用TCP在序列化/反序列化中避免交叉语言依赖?

c – 如何使用TCP在序列化/反序列化中避免交叉语言依赖?

作者:互联网

我需要与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中使用deserializator并在可能的情况下从python调用的其他可能性.这个问题的优雅解决方案?

解决方法:

如果您真的想要跨语言和跨平台而不必担心消息的结束位置,请查看Google ProtobufZeroMQ的组合.

使用常规套接字时,您首先要读取消息的大小(您可以在此前面添加),然后您将知道字节数组的完整消息的位置.

示例protobuf zmq用法:

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

使用protobuf编译器生成C代码(或ruby / python / etc).

要在您的代码中使用它:

#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());

标签:python,c,algorithm,tcp,protocols
来源: https://codeday.me/bug/20190826/1725106.html