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
}