повысить json-сериализацию и сообщение-очередь segfault

Я делаю некоторый тест с надстройкой interprocess и структурой ptree, у меня есть segfault, когда я пытаюсь прочитать отправленное сообщение (или когда я пытаюсь разобрать его в json).

Я использую Boost1,49 на Debian Linux.

я сериализую его в json для последующего использования, и потому что я не нашел хорошего документа для прямой сериализации свойств boost.

это код, который я использую для проверки (в командной строке говорят, где находится segfault):

recv.cc

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/interprocess/ipc/message_queue.hpp>
#include <sstream>struct test_data{
std::string action;
std::string name;
int faceID;
uint32_t Flags;
uint32_t freshness;
};

test_data recvData()
{
boost::interprocess::message_queue::remove("queue");
boost::property_tree::ptree pt;
test_data data;
std::istringstream buffer;
boost::interprocess::message_queue mq(boost::interprocess::open_or_create,"queue", 1, sizeof(buffer)
boost::interprocess::message_queue::size_type recvd_size;
unsigned int pri;
mq.receive(&buffer,sizeof(buffer),recvd_size,pri);
std::cout << buffer.str() << std::endl; //the segfault is there
boost::property_tree::read_json(buffer,pt);
data.action = pt.get<std::string>("action");
data.name = pt.get<std::string>("name");
data.faceID = pt.get<int>("face");
data.Flags = pt.get<uint32_t>("flags");
data.freshness = pt.get<uint32_t>("freshness");
boost::interprocess::message_queue::remove("queue");
return data;
}

int main()
{
test_data test;
test = recvData();
std::cout << test.action << test.name << test.faceID << test.Flags << test.freshness << std::endl;
}

sender.cc

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/interprocess/ipc/message_queue.hpp>
#include <sstream>struct test_data{
std::string action;
std::string name;
int faceID;
uint32_t Flags;
uint32_t freshness;
};int sendData(test_data data)
{
boost::property_tree::ptree pt;
pt.put("action",data.action);
pt.put("name",data.name);
pt.put("face",data.faceID);
pt.put("flags",data.Flags);
pt.put("freshness",data.freshness);
std::ostringstream buffer;
boost::property_tree::write_json(buffer,pt,false);
boost::interprocess::message_queue mq(boost::interprocess::open_only,"chiappen")
std::cout << sizeof(buffer) << std::endl;
mq.send(&buffer,sizeof(buffer),0);
return 0;
}int main ()
{
test_data prova;
prova.action = "registration";
prova.name = "prefix";
prova.Flags = 0;
prova.freshness = 52;
sendData(prova);
}

0

Решение

Я знаю, что уже немного поздно, чтобы ответить, но в любом случае ..
Вы не можете передать istringstream в качестве буфера для получения. Очереди повышенных сообщений обрабатывают только необработанные байты и не обрабатывают объекты, подобные std.

Чтобы это работало, вы должны использовать массив символов или любой буфер, ранее зарезервированный для malloc.

Пример:

char buffer [1024];
mq.receive(buffer, sizeof(buffer), recvd_size, pri);

Для отправки то же самое, вы можете отправлять только необработанные байты, поэтому вы не можете использовать ostringstream.

Надеюсь, поможет.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector