|
Boost Users : |
Subject: [Boost-users] sending a serialized object using message_queue
From: Luciano Afranllie (listas.luafran_at_[hidden])
Date: 2009-12-10 22:04:02
Hi,
I am trying to send a serialized object using message_queue but I am
getting a boost::interprocess_exception::library_error in the sender
side.
I think the problem is me but after a lot of google I could not find a
way to make it work
This is the method where I am trying to send the message:
int RemoteMgr::sendMsgToPeers(const IPCMsg &msg)
{
std::cout << "RemoteMgr::sendMsgToPeers()\n";
std::ostringstream archive_stream;
boost::archive::text_oarchive archive(archive_stream);
archive << msg;
std::string outbound_data = archive_stream.str();
std::vector<char> outbound(outbound_data.begin(), outbound_data.end());
std::cout << "outbound_data = [" << outbound_data << "]\n";
std::cout << "size = " << outbound.size() << "\n";
// TODO: Not working yet. How to send a string with serialized data?
message_queue mq_master(open_only, "master_queue");
mq_master.send(&outbound, outbound.size(), 0);
}
Where IPCMsg is
class IPCMsg
{
public:
IPCMsg() {}
IPCMsg(const std::string &type, const std::string &payload);
~IPCMsg();
std::string getSender() { return m_sender; }
std::string getType() { return m_type; }
std::string getPayload() { return m_payload; }
template<class Archive>
void serialize(Archive & ar, const unsigned int /* file_version */)
{
ar & BOOST_SERIALIZATION_NVP(m_sender)
& BOOST_SERIALIZATION_NVP(m_type)
& BOOST_SERIALIZATION_NVP(m_payload);
}
private:
std::string m_sender;
std::string m_type;
std::string m_payload;
};
Receiver code is like this:
unsigned int priority;
std::size_t recvd_size;
IPCMsg msg;
std::vector<char> inbound_data(100);
std::cout << "Waiting for peers" << std::endl;
while (!terminate)
{
if (mq.try_receive(&inbound_data, inbound_data.size(),
recvd_size, priority))
{
std::cout << "New message received.\n";
std::string archive_data(&inbound_data[0], inbound_data.size());
std::istringstream archive_stream(archive_data);
boost::archive::text_iarchive archive(archive_stream);
archive >> msg;
std::cout << "msg type = " << msg.getType() << "\n";
}
}
Hope you can help. Thanks!
Luciano
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net