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);
}
:あなたがやっているすべては、あなたが同じメッセージを使用することができます転送している場合は
メッセージを最初に調べる(つまりデシリアライズする)場合、特定の条件に一致する場合にのみ転送しますか?その場合、まだ受信したメッセージを転送することはできますか? また、上記のコード例では、私はあなたが意味すると思います。 fChannels.at( "data2")。at(0).Send(input); – charis
私は本当にやった。バッファからstd :: stringを作成すると、コピーが作成され、メッセージは変更されずにそのまま残ります。ただし、 'Send'コールの後のある時点では、' input'の内容はzeromqによって削除/解放されますので、その前に文字列を作成してください。 – David