如何使用引用发送ZMQ消息?

时间:2017-09-06 08:41:52

标签: c++ c++11 zeromq

ZMQ_REQ / ZMQ_REP example中,初始化缓冲区,然后使用memcpy将邮件复制到其中。

具体做法是:

zmq::message_t reply (5);
memcpy (reply.data (), "World", 5);
socket.send (reply);

如何使用字符指针引用回复消息?

这就是:

char* text = "Hello";
zmq::message_t reply ();
socket.send (text);

2 个答案:

答案 0 :(得分:2)

在您提供的示例中,您不是发送引用而是发送指针。

使用ZMQ API,您必须memcpy消息缓冲区中的数据。

您可以编写自己的包装函数

bool send(zmq::socket_t& socket, const std::string& string) {
    zmq::message_t message(string.size());
    std::memcpy (message.data(), string.data(), string.size());
    bool rc = socket.send (message);
    return (rc);
}

bool send(zmq::socket_t& socket, const char* data) {
    size_t size = strlen(data); // Assuming your char* is NULL-terminated
    zmq::message_t message(size);
    std::memcpy (message.data(), data, size);
    bool rc = socket.send (message);
    return (rc);
}

然后发送您的消息:

char* text = "Hello";
send(socket, text);

答案 1 :(得分:0)

所选答案说“ With the ZMQ API you have to memcpy the data in the message buffer.”,但可以使用Zero-MQ的zero-copy跳过此步骤:

void deallocator(void* data, void* hint)
{
   free(data);
}

bool send(zmq::socket_t& socket, const char* data){
   zmq::message_t msg;
   void* hint = NULL;
   zmq::message_t mess((void*) data, 1000000, deallocator, hint);
   socket.send(msg);
}