2016-08-01 23 views
0

我收到一个大的,系列化,二进制使用ZeroMQ对象:也通过ZeroMQ接收对象为字符串的正确方法是什么,然后通过另一个套接字通过零拷贝发送它?

std::unique_ptr<Message> output(CreateMessage(serialStr.length())); 
memcpy(output->GetData(), serialStr.c_str(), serialStr.length()); 

fChannels.at("data2").at(0).Send(output); 

,它是一个:

std::unique_ptr<Message> input(CreateMessage()); 

if (Receive(input, "data") > 0) { 
    std::string serialStr(static_cast<char*>(input->GetData()), input->GetSize()); 
} 

如何可以通过另一个套接字发送这个对象,避免了不必要的memcpy好主意使用std::string来包含一个二进制对象,或者我应该使用一个void* in代替?

回答

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

相关问题