2016-08-01 1 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*を使用する必要があります代わりに?また、あなたがメッセージとして既存のバッファを使用するために4引数のメッセージのコンストラクタで見ることができ

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

:あなたがやっているすべては、あなたが同じメッセージを使用することができます転送している場合は

答えて

1

、あなたのようなものを使用することができますペイロードをコピーするのではなく、

+0

メッセージを最初に調べる(つまりデシリアライズする)場合、特定の条件に一致する場合にのみ転送しますか?その場合、まだ受信したメッセージを転送することはできますか? また、上記のコード例では、私はあなたが意味すると思います。 fChannels.at( "data2")。at(0).Send(input); – charis

+1

私は本当にやった。バッファからstd :: stringを作成すると、コピーが作成され、メッセージは変更されずにそのまま残ります。ただし、 'Send'コールの後のある時点では、' input'の内容はzeromqによって削除/解放されますので、その前に文字列を作成してください。 – David

関連する問題