#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. спасибо за ответ, я сделал это, но все еще ошибка сегментации при синтаксическом анализе.