2016-08-01 3 views
0

Я получаю большое, сериализованную двоичный объект с помощью 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* в вместо него?

ответ

1

Если все, что вы делаете, переадресацию, то вы можете использовать один и то же сообщение, вы можете использовать что-то вроде:

std::unique_ptr<Message> input(CreateMessage()); 
if (Receive(input, "data") > 0) 
{ 
    fChannels.at("data2").at(0).Send(input); 
} 

В качестве альтернативы вы можете посмотреть на конструктору сообщение 4 аргумента использовать существующий буфер в качестве сообщения полезной нагрузки, а не копирования.

+0

Что делать, если я хочу сначала изучить сообщение (т. Е. Де-сериализовать его) и перенаправить его только в том случае, если он соответствует определенным критериям? Могу ли я в этом случае просто отправить полученное сообщение? Кроме того, в приведенном выше примере кода, я думаю, вы имеете в виду fChannels.at («data2»). At (0) .Send (input); – charis

+1

Я действительно. Создание std :: string из буфера сделает копию и оставит сообщение неизменным, так что это сработает. Предупреждение, хотя в какой-то момент времени после вызова 'Send' содержимое' input' будет удалено/освобождено zeromq, поэтому сделайте свою строку до этого. – David