zeromq с ошибкой сегментации protobuf при синтаксическом анализе в c

#c #protocol-buffers #zeromq

#c #буферы протокола #zeromq

Вопрос:

Я использую 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(amp;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 (amp;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());
 

Спасибо.

Комментарии:

1. Я знаю, что это более старый поток, но, возможно, вы пробовали ParseFromArray() и SerializeToArray()?

Ответ №1:

IIRC вы не можете напрямую преобразовать a zmq::message_t в строку. Вероятно, вам следует использовать data элемент только для создания строки. Также recieved.data не '' завершается, поэтому вам также потребуется передать размер при создании ls_msg_str экземпляра:

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

Комментарии:

1. спасибо за ответ, я сделал это, но все еще ошибка сегментации при синтаксическом анализе.