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 Protobuf和ZeroMQ的组合.
使用常规套接字时,您首先要读取消息的大小(您可以在此前面添加),然后您将知道字节数组的完整消息的位置.
示例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