簡體   English   中英

提升json序列化和message_queue segfault

[英]boost json serialization and message_queue segfault

我正在使用boost-interprocess和ptree結構進行一些測試,當我嘗試讀取已發送的消息時(或當我嘗試在json中解析它時),我遇到了段錯誤。

我在debian linux上使用boost1.49。

我正在json中對其進行序列化以供以后使用,並且因為我沒有找到用於boost屬性三的直接序列化的任何好的文檔。

這是我用來測試的代碼(連說的segfault在哪里):

修訂版

#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);
}

我知道現在答案還有些晚,但是無論如何..您不能將istringstream傳遞為接收緩沖區。 Boost消息隊列僅處理原始字節,而不處理類似std的對象。

要使其工作,必須使用char數組或以前由malloc保留的任何緩沖區。

例如:

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

發送相同,只能發送原始字節,因此不能使用ostringstream。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM