【问题标题】:zeromq with protobuf segmentation fault while parsing in c++zeromq 在 C++ 中解析时出现 protobuf 分段错误
【发布时间】:2014-06-30 15:18:59
【问题描述】:

我正在使用 zeromq 和 protobuf 来发送/接收消息,但是在解析接收到的数据时代码在接收端崩溃并出现 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());

谢谢。

【问题讨论】:

  • 我知道这是一个较旧的线程,但您是否尝试过 ParseFromArray() 和 SerializeToArray() ?

标签: c++ protocol-buffers zeromq


【解决方案1】:

IIRC 你不能直接将zmq::message_t 转换为字符串。您可能应该只使用 data 成员来创建字符串。 recieved.data 也不是 '\0' 终止的,因此在构造 ls_msg_str 实例时还需要传递大小:

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

【讨论】:

  • 感谢回复,我做到了,但解析时仍然出现分段错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 2020-06-01
  • 1970-01-01
相关资源
最近更新 更多