在使用 ZMQ 和 protobuf 时接收 0 大小的消息
Receiving 0 size messages while using ZMQ and protobuf
我正在尝试使用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时,它对我有用。
我遇到了完全相同的问题;我发现zmq::message_t
必须超出范围,或者需要调用rebuild
。
例如,如果发布者看起来像这样。
zmq::message_t msg(3);
memcpy(msg.data(), "abc", 3);
while (1 == 1) {
pubSocket.send(msg);
sleep(1);
}
订阅者将收到零长度的消息。 如果代码已更改为
while (1 == 1) {
zmq::message_t msg(3);
memcpy(msg.data(), "abc", 3);
pubSocket.send(msg);
sleep(1);
}
或
zmq::message_t msg(3);
memcpy(msg.data(), "abc", 3);
while (1 == 1) {
pubSocket.send(msg);
msg.rebuild(3);
sleep(1);
}
然后订阅者将收到一条 3 字节的消息。
相关文章:
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 为什么 zmq 将多条消息打包到一个 TCP 帧中?
- 当通过tcp接收编码图像的消息时,zmq在第二个循环中崩溃
- 如何在ZMQ代理中记录接收消息?
- ZMQ 经销商向自身发送和接收消息
- 未收到 ZMQ 消息
- 如何使用参考发送ZMQ消息
- 停止zmq消息
- ZMQ等待消息,让客户端等待回复
- Zeromq (zmq)与c++发布者和python订阅者丢失消息
- ZMQ消息传递特定端点
- 如何通过 ZMQ 发送 Cap'n 原型消息
- 在使用 ZMQ 和 protobuf 时接收 0 大小的消息