什么时候应该使用zmq_msg_t?

时间:2016-05-23 19:33:35

标签: c++ zeromq

发送和接收消息的功能如下:

int zmq_send (void *socket, void *buf, size_t len, int flags);
int zmq_recv (void *socket, void *buf, size_t len, int flags);

但是,从文档中我不清楚何时必须直接使用zmq_msg_t或我的自定义数据。那么在哪些情况下我应该考虑使用zmq_msg_t并在这种情况下直接发送我的数据?

2 个答案:

答案 0 :(得分:1)

从不TLDR

要非常小心如何设置,加载/卸载和使用/破坏酷炫强大的 ZeroMQ - 图书馆服务所依赖的低级数据结构。

否则,最好还是使用高级伴侣功能。

不要犹豫,阅读The Book - 值得一时

Pieter HINTJENS建议在第42页第4项:

  

要发布(不销毁)消息,请拨打 zmq_msg_close() 。这会丢弃一个引用,最终0MQ将破坏该消息。

API documentation中,您可能会发现更加谨慎:

The zmq_msg_close() function shall inform the ØMQ infrastructure
that any resources associated with the message object
referenced by msg are no longer required and may be released.

Actual release of resources associated with the message object
shall be postponed by ØMQ until all users of the message or underlying
data buffer have indicated it is no longer required.

Applications should ensure that zmq_msg_close() is called
once a message is no longer required, otherwise memory leaks may occur.

永远不要直接访问zmq_msg_t成员,而是始终使用zmq_msg系列功能。

Return value:
              zmq_msg_close() function shall return zero if successful.
                              Otherwise it shall return -1 and
                              set errno to one of the values defined below.
Errors
              EFAULT          Invalid message.

答案 1 :(得分:1)

这两个函数都将在内部构造zmq_msg_t,然后使用函数的zmq_msg_t变体。这很方便,但如果您想多次发送相同的消息,那么创建zmq_msg_t并使用这些变体会更有效(更少复制)。