如何正确使用zmq_msg_more?

时间:2013-01-30 19:41:40

标签: c zeromq

Code Connected Volume 1 - 第47页有一个关于如何接收多部分消息的示例:

while (1) {
    zmq_msg_t message;
    zmq_msg_init(&message);
    zmq_msg_recv(&message, socket, 0);
    // Process the message frame
    ...
    zmq_msg_close(&message);
    if (!zmq_msg_more(&message))
        break;
}

这是对的吗?我们不应该在zmq_msg_close()之后使用zmq_msg_more()吗?

2 个答案:

答案 0 :(得分:5)

zmq_msg_more()zmq_msg_recv()(ZeroMQ 3.2.2 Stable)的API参考都包含示例,显示{/ 3}}在 zmq_msg_more之后被称为。据我所知,API文档没有明确说明任何与此相矛盾的内容,因此Code Connected的示例似乎是错误的。 zmq_msg_close()的文档指出实际内存释放可能会被底层图层推迟,暗示zmq_msg_more()操作可能成功,但在关闭后调用它仍然看起来不对信息。

来自zmq_msg_close()的示例(为了便于阅读而略微编辑):

zmq_msg_t part;
while (true) 
{
    //  Create an empty ØMQ message to hold the message part
    int rc = zmq_msg_init (&part);
    assert (rc == 0);

    //  Block until a message is available to be received from socket
    rc = zmq_recvmsg (socket, &part, 0);
    assert (rc != -1);

    if (zmq_msg_more (&part))
        fprintf (stderr, "more\n");
    else 
    {
        fprintf (stderr, "end\n");
        break;
    }
    zmq_msg_close (part); 
}

但是,查看关于zmq_msg_more() API documentation (3.2.2)的ZeroMq指南,该示例实际上会在关闭消息后检查更多消息,但这是通过使用Multi-Part Messages检查套接字来实现的。 ,不使用使用对邮件的任何引用。我怀疑代码连接示例只是使用了该示例,并从zmq_getsockopt()更改为zmq_msg_more()(可能不太正确)。

来自zmq_getsockopt()的示例:

while (1) 
{
    zmq_msg_t message;
    zmq_msg_init (&message);
    zmq_msg_recv (&message, socket, 0);
    //  Process the message frame
    zmq_msg_close (&message);
    int more;
    size_t more_size = sizeof (more);
    zmq_getsockopt (socket, ZMQ_RCVMORE, &more, &more_size);
    if (!more)
        break;      //  Last message frame
}

答案 1 :(得分:0)

也许这个答案会帮助某人。

来自“ libzmq / doc / zmq_msg_more.txt”

zmq_msg_more()函数表明这是否是多部分的一部分 消息,还有其他部分要接收。此方法可以放心地 在 zmq_msg_close() 之后调用。此方法与 zmq_msg_get()相同 带有ZMQ_MORE的参数。