c++ - 使用 ZMQ 和 protobuf 时收到 0 大小的消息

标签 c++ serialization zeromq protocol-buffers

我正在尝试使用 ZMQ 在客户端和服务器之间建立一个基本的通信系统。我正在使用 protobuf 作为消息格式。 我的问题是,当我从客户端发送消息时,消息大小为 34,但服务器上收到的消息大小为 0。

以下是我的代码;

客户端.cpp

tutorial::Person person;
person.set_id(1234);
person.set_name("john");
person.set_email("john@mxyz.com");
person.set_phonenumber("12345678");


zmq::context_t context (1); //  Prepare our context and socket
zmq::socket_t socket (context, ZMQ_PAIR);

std::cout << "Connecting to server…" << std::endl;
int linger = 0;// ms
socket.setsockopt(ZMQ_LINGER, &linger, sizeof(linger));
socket.connect ("tcp://127.0.0.1:20000");

std::string msg_str;
person.SerializeToString(&msg_str);
std::cout << "Size of message string is "<< msg_str.size()<<std::endl;
zmq::message_t request (msg_str.size());
memcpy ((void *) request.data (), msg_str.c_str(), msg_str.size());
std::cout << "Sending Person data ..." << std::endl;
socket.send (request);

socket.close();

google::protobuf::ShutdownProtobufLibrary();
return 0;

服务器.cpp :

zmq::context_t context(1); //  Prepare our context and socket
zmq::socket_t socket(context, ZMQ_PAIR);
int linger = 0; // ms
socket.setsockopt(ZMQ_LINGER, &linger, sizeof(linger));
socket.bind("tcp://127.0.0.1:20000");
while (true)
 {
    zmq::message_t request;
    int recieved = socket.recv(&request);
    std::string msg(static_cast<char*>(request.data()),request.size());
    std::cout<<"Size of message recieved is "<<  msg.size()<<std::endl;
    tutorial::Person person;
    person.ParseFromString(msg);
    std::string text_str1;
    google::protobuf::TextFormat::PrintToString(person, &text_str1);
}
socket.close();

客户端的输出是:

Size of message string is 34

服务器的输出是:

Size of message received is 0

我也尝试过切换到 ParseToArray,但没有帮助。 感谢任何形式的帮助。

最佳答案

我已经用另一种方法解决了。实际上早些时候我安装了 libzmq lib ,但后来当我切换到 libzmq3-dev 时它对我有用。

关于c++ - 使用 ZMQ 和 protobuf 时收到 0 大小的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38420559/

相关文章:

c# - 类序列化到 XML

c++ - 什么时候应该使用 zmq_msg_t?

python - 运行第二个 zmq.eventloop.ioloop

C++ 指针作用域

c++ - 将代码从 unix 移动到 windows xp

c++ - 错误 : uint64_t was not declared in this scope when compiling C++ program

java - 为什么 SAXException 是可序列化的?

c++ - FFMpeg:将 h264 流写入 mp4 容器而不进行任何更改

python - 将类实例序列化为 JSON

node.js - 两个不同的 `publisher sockets`可以使用zmq在相同的地址和端口上发布消息吗?