zeromq with protobuf segmentation fault while pars

2019-08-09 04:30发布

问题:

I am using zeromq with protobuf to send/recieve messages but code was crashing on receiver end with Segmentation fault (core dumped) error while parsing the received data.

Scan is my message.

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

I tried different way of converting zmq::message_t to std::string but still it gives segmentation fault.

Edit update:

//std::string ls_msg_str((char*)recieved); 
  std::string ls_msg_str((char*)recieved.data(),recieved.size());

thanks.

回答1:

IIRC you can't directly cast a zmq::message_t to a string. You should probably only use the data member to create the string. Also the recieved.data is not '\0' terminated, so you would also need to pass the size when you construct the ls_msg_str instance:

std::string ls_msg_str((char*)recieved.data,recieved.size);
                                    // ^^^^          ^^^^