我正在使用带有protobuf的zeromq来发送/接收消息,但在解析接收到的数据时,代码在接收器端崩溃并出现Segmentation fault (core dumped)
错误。
Scan
是我的信息。
sender.cpp
Scan proto_ls_msg;
proto_ls_msg.set_angle_min(0.0);
proto_ls_msg.set_angle_max(180.5);
std::string ls_msg_str;
proto_ls_msg.SerializeToString(&ls_msg_str);
zmq::message_t request (ls_msg_str.size());
memcpy (request.data(), ls_msg_str.c_str(),ls_msg_str.size());
socket.send (request);
collector.cpp
zmq::message_t recieved;
socket.recv (&recieved);
//thanks to πάντα ῥεῖ
std::string ls_msg_str((char*)recieved.data(),recieved.size());
Scan *pb_laser_msg_rcv;
pb_laser_msg_rcv->ParseFromString(ls_msg_str); // <-- Segmentation fault here
我尝试了将zmq::message_t
转换为std::string
的不同方法,但仍然会导致细分错误。
修改更新:
//std::string ls_msg_str((char*)recieved);
std::string ls_msg_str((char*)recieved.data(),recieved.size());
感谢。
答案 0 :(得分:0)
IIRC您无法直接将zmq::message_t
转换为字符串。您应该只使用data
成员来创建字符串。
此外,recieved.data
不会'\0'
终止,因此您在构建ls_msg_str
实例时也需要传递大小:
std::string ls_msg_str((char*)recieved.data,recieved.size);
// ^^^^ ^^^^