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
}