Я получаю большое, сериализованную двоичный объект с помощью ZeroMQ
:Каков правильный способ получить объект в виде строки через ZeroMQ, а затем отправить его с нулевой копией через другой сокет?
std::unique_ptr<Message> input(CreateMessage());
if (Receive(input, "data") > 0) {
std::string serialStr(static_cast<char*>(input->GetData()), input->GetSize());
}
Как я могу отправить этот объект через другой сокет избежать ненужной memcpy
:
std::unique_ptr<Message> output(CreateMessage(serialStr.length()));
memcpy(output->GetData(), serialStr.c_str(), serialStr.length());
fChannels.at("data2").at(0).Send(output);
Кроме того, действительно ли это хорошая идея использовать std::string
, чтобы содержать двоичный объект, или я должен использовать void*
в вместо него?
Что делать, если я хочу сначала изучить сообщение (т. Е. Де-сериализовать его) и перенаправить его только в том случае, если он соответствует определенным критериям? Могу ли я в этом случае просто отправить полученное сообщение? Кроме того, в приведенном выше примере кода, я думаю, вы имеете в виду fChannels.at («data2»). At (0) .Send (input); – charis
Я действительно. Создание std :: string из буфера сделает копию и оставит сообщение неизменным, так что это сработает. Предупреждение, хотя в какой-то момент времени после вызова 'Send' содержимое' input' будет удалено/освобождено zeromq, поэтому сделайте свою строку до этого. – David