3

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()ですか?

4

2 に答える 2

5

zmq_msg_more()およびzmq_msg_recv()(ZeroMQ 3.2.2 Stable)のAPIリファレンスには、どちらもzmq_msg_close()がzmq_msg_moreの後に呼び出されることを示す例が含まれています。私の知る限り、APIドキュメントにはこれと矛盾することは何も明記されていないため、CodeConnectedの例は間違っているようです。のドキュメントに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); 
}

ただし、マルチパートメッセージに関する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 に答える