2015-09-20 77 views
0

我正在使用boost消息隊列在不同的進程間進行通信。我正在傳輸一個Packet類型的對象。爲此,我在發送和接收函數中使用序列化和反序列化。Boost Interprocess發送給出錯誤:boost :: interprocess_exception :: library_error

然而,當我嘗試發送數據時,我收到此錯誤: 的boost :: interprocess_exception :: library_error

沒有其他資料中給出。

這就是我如何創建消息隊列。

for(i = 0; i< PROC_MAX_E ; i++){ 
     std::string mqName = std::string("mq") + std::to_string(i); 
     std::cout << " Size of Packet is " << sizeof(Packet) << std::endl; 
     message_queue mq(open_or_create, mqName.c_str(), MAX_QUEUE_SIZE_E, 100*sizeof(Packet)); // size of packet later 
     } 

這是我的包:

class Packet{ 
    public : 
    Packet(); 
    Packet(uint32_t aType, uint32_t aProcId); 
    ~Packet(); 
    uint32_t getType(); 
    union{ 
     uint32_t mFuncId; 
     //uint8_t mResult8; 
     uint32_t mResult32; 
     //uint64_t mResult64; 
     //bool  mResult; 
     //uint8_t* mAddr8; 
     //uint32_t* mAddr32; 
     //uint64_t* mAddr64; 
     //char  mData[MAX_PACKET_SIZE]; // This will be used to store serialized data 
    }; 

    friend class boost::serialization::access; 

    template <class Archive> 
    void serialize(Archive & ar, const unsigned int version){ 
     ar & _mType; 
     ar & _mProcId; 
     //ar & mData; 
     ar & mFuncId; 
     //ar & mResult32; 
     } 


    private : 
    uint32_t _mType; 
    uint32_t _mProcId; 


    }; // end class 

} // end namespace 

這是我的序列化和反序列化功能:

std::string IPC::_serialize(Packet aPacket){ 
    std::stringstream oss; 
    boost::archive::text_oarchive oa(oss); 
    oa << aPacket; 
    std::string serialized_string (oss.str()); 
    return serialized_string; 

    } 



    Packet IPC::_deserialize(std::string aData){ 
    Packet p; 
    std::stringstream iss; 
    iss << aData; 
    boost::archive::text_iarchive ia(iss); 
    ia >> p; 
    return p; 
    } 

這是我的發送和接收功能:

bool IPC::send(uint32_t aProcId, Packet aPacket){ 
    try{ 
     _mLogFile << "<-- Sending Data to Process : " << aProcId << std::endl; 
     //uint32_t data = aPacket; 
     std::string mqName = std::string("mq") + std::to_string(aProcId); 
     message_queue mq(open_only, mqName.c_str()); 
     //serialize Packet 
     std::cout << "Serializing \n"; 
     std::string data = _serialize(aPacket); 
     std::cout << " Serialized data =" << data.data() << "Size = " << data.size()<< std::endl; 
     mq.send(data.data(), data.size(), 0); 
     //mq.send(&data, sizeof(uint32_t), 0); 
    }catch(interprocess_exception &ex){ 
     _mLogFile << "***ERROR*** in IPC Send to process : " << aProcId << " " << ex.what() << std::endl; 
     std::cout << "***ERROR*** in IPC Send to process : " << aProcId << " " << ex.what() << std::endl; 
     _ipc_exit(); 
    } 
    } 

我在期間得到例外mq.send

當我只傳輸整數它工作正常。只有序列化和反序列化,我得到這個錯誤

任何幫助非常讚賞。我有點卡住,因爲異常消息也不清楚。 我使用升壓1_57_0

RGDS 薩班

+0

你試過調試嗎?在gdb中,catch catch有幫助。另外,在(de)序列化函數體中添加錯誤處理(我不確定它們是否被使用)。特別是,捕獲存檔異常。 – sehe

+0

Catchpoint 3(異常拋出),__cxxabiv1 :: __ cxa_throw(obj = 0x625770,tinfo = 0x416c90 , dest = 0x4077a2 )at ../../../../../src/lnx64/libstdc++-v3/libsupc++/eh_throw.cc:71 71 ../../../../../ src/lnx64/libstdC++ - v3/libsupC++/eh_throw.cc:沒有這樣的文件或目錄。 – Sapan

+0

只是爲了補充說,執行mq.send函數時出現異常 – Sapan

回答

0

嘗試關閉或使用字符串前沖洗串蒸汽。

std::string IPC::_serialize(Packet aPacket){ 
    std::stringstream oss; 
    { 
     boost::archive::text_oarchive oa(oss); 
     oa << aPacket; 
    } 
    return oss.str(); 
} 
+0

這也沒有幫助。我在gdb中添加了catch拋出異常。不要確定這個例外的含義 – Sapan

相關問題