通过ZeroMQ将对象作为字符串接收然后通过另一个套接字以零拷贝发送它的正确方法是什么?

时间:2016-08-01 13:01:51

标签: c++ string pointers 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 个答案:

答案 0 :(得分:1)

如果你所做的只是转发然后你可以使用相同的消息,你可以使用类似的东西:

public int getCountForDuration(Long startTime, Long endTime, Collection<String> ids){
    List<String> idList = new ArrayList<>(ids);
    JsonObject placeHolders = JsonObject.create()
                                        .put("ids", JsonArray.from(idList))
                                        .put("startTime", startTime)
                                        .put("endTime", endTime);
    N1qlQuery query = N1qlQuery.parameterized(COUNT_STATEMENT, placeHolders)            
    N1qlQueryResult result = bucket.query(query);
    ...
}

或者,您可以查看4参数消息构造函数,以使用现有缓冲区作为消息有效负载而不是复制。