0

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

Я использую boost1.49 на debian linux.

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

это код, я использую для теста (говорят, связался где это выдаёт ошибку сегментации):

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

Я верю, что это то, что я не понимаю правильно о объекте std: stringstream – kurojishi

ответ

3

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

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

Ex:

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

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

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

+0

yup это был ответ, я забыл авторейтись на вопрос спасибо :) – kurojishi

Смежные вопросы