Как передать сложные объекты ( std::string ) через очередь boost::interprocess::message

Есть ли у кого-нибудь пример кода, показывающий конвейер сериализации std::string, отправляющий его через boost::interprocess::message_queue и возвращающий его обратно?


person bradgonesurfing    schedule 06.08.2010    source источник


Ответы (2)


Вам необходимо сериализовать данные, потому что boost::interprocess::message_queue работает с байтовыми массивами. Если все ваши сообщения являются строками, просто выполните:

size_t const max_msg_size = 0x100;
boost::interprocess::message_queue q(..., max_msg_size);

// sending
std::string s(...);
q.send(s.data(), s.size(), 0);

// receiving
std::string s;
s.resize(max_msg_size);
size_t msg_size;
unsigned msg_prio;
q.receive(&s[0], s.size(), msg_size, msg_prio);
s.resize(msg_size);
person Maxim Egorushkin    schedule 06.08.2010

Решение может состоять в том, чтобы написать функцию, которая имеет в качестве входных данных объект, который вы хотите отправить (например, строку с переменным размером), и в качестве вывода контейнер объектов фиксированного размера.

Что-то вроде:

int Tokenize(std::vector<MessageToken>&, const Message&) const;
int Merge(Message&, const std::vector<MessageToken>&) const;                                    

Затем эти объекты фиксированного размера могут быть отправлены/извлечены из message_queue.

Преимущество по сравнению с решением Максима в том, что вам не нужно указывать параметр max_msg_size.

person Pietro    schedule 03.10.2011