3

Code Connected Volume 1 - page 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()afterzmq_msg_more()吗?

4

2 回答 2

5

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

zmq_msg_more() API 文档 (3.2.2)中的示例(为便于阅读而稍作编辑):

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); 
}

但是,查看有关Multi-Part Messages的 ZeroMq 指南,该示例实际上在关闭消息检查更多消息,但这是通过使用zmq_getsockopt()检查套接字来实现的,而不使用对消息的任何引用。我怀疑 Code Connected 示例只是使用了该示例并从 更改zmq_getsockopt()zmq_msg_more()(可能不正确)。

ZeroMq 指南中的示例(多部分消息)

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
}
于 2013-02-01T13:56:21.777 回答
0

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

来自“libzmq/doc/zmq_msg_more.txt”

zmq_msg_more ()函数指示这是否是多部分消息的一部分,并且还有更多部分要接收。在zmq_msg_close()之后可以安全地调用此方法。此方法与带有 ZMQ_MORE 参数的zmq_msg_get()相同 。

于 2020-08-27T23:34:05.817 回答