1、初始化消息
1.1 zmq_msg_init(3)
1.1.1 名称
zmq_msg_init - 初始化空的ZMQ消息
1.1.2 概要
int zmq_msg_init(zmq_msg_t * msg);
1.1.3 描述
zmq_msg_init()函数将初始化由msg引用的消息对象,以表示一个空的消息。 在使用zmq_recv()接收消息之前调用此函数时最有用。切勿直接访问zmq_msg_t成员,而应始终使用zmq_msg系列函数。函数zmq_msg_init(),zmq_msg_init_data()和zmq_msg_init_size()是互斥的。 永远不要初始化相同的zmq_msg_t两次。
1.1.4 返回值
zmq_msg_init()函数始终返回零。
1.1.5 错误
没有定义错误。
1.2 zmq_msg_init_size(3)
1.2.1 名称
zmq_msg_init_size - 初始化指定大小的ZMQ消息
1.2.2 概要
int zmq_msg_init_size(zmq_msg_t * msg,size_t size);
1.2.3 描述
zmq_msg_init_size()函数应分配存储消息大小字节所需的任何资源,并初始化由msg引用的消息对象以表示新分配的消息。实现应选择将消息内容存储在堆栈(小消息)还是堆(大消息)上。出于性能原因,zmq_msg_init_size()不应清除消息数据。切勿直接访问zmq_msg_t成员,而应始终使用zmq_msg系列函数。函数zmq_msg_init(),zmq_msg_init_data()和zmq_msg_init_size()是互斥的。永远不要初始化相同的zmq_msg_t两次。
1.2.4 返回值
如果成功,zmq_msg_init_size()函数将返回零。否则它将返回-1并将errno设置为下面定义的值之一。
1.2.5 错误
ENOMEM:没有足够的存储空间可用。
1.3 zmq_msg_init_data(3)
1.3.1 名称
zmq_msg_init_data - 从提供的缓冲区初始化ZMQ消息
1.3.2 概要
typedef void(zmq_free_fn)(void * data,void * hint);
int zmq_msg_init_data(zmq_msg_t * msg,void * data,size_t size,zmq_free_fn * ffn,void * hint);
1.3.3 描述
zmq_msg_init_data()函数将初始化由msg引用的消息对象,以表示位于地址数据处的缓冲区所引用的内容,大小为字节长。不得执行任何数据副本,ZMQ应取得所提供缓冲区的所有权。如果提供了,一旦数据缓冲区不再被ZMQ需要,数据和提示参数提供给zmq_msg_init_data(),就会调用解除分配函数ffn。切勿直接访问zmq_msg_t成员,而应始终使用zmq_msg系列函数。解除分配函数ffn需要是线程安全的,因为它将从任意线程中调用。如果未提供释放函数,则分配的内存不会被释放,这可能会导致内存泄漏。函数zmq_msg_init(),zmq_msg_init_data()和zmq_msg_init_size()是互斥的。永远不要初始化相同的zmq_msg_t两次。
1.3.4 返回值
如果成功,zmq_msg_init_data()函数将返回零。否则它将返回-1并将errno设置为下面定义的值之一。
1.3.5 错误
ENOMEM:没有足够的存储空间可用。
2、发送和接收消息
2.1 zmq_msg_send(3)
2.1.1 名称
zmq_msg_send - 在套接字上发送消息部分
2.1.2 概要
int zmq_msg_send(zmq_msg_t * msg,void * socket,int flags);
2.1.3 描述
zmq_msg_send()函数与zmq_sendmsg(3)相同,在以后的版本中将不再使用。 zmq_msg_send()与其他消息操作函数更加一致。
zmq_msg_send()函数应该将由msg参数引用的消息排队,以便发送到由socket参数引用的套接字。 flags参数是下面定义的标志的组合:
ZMQ_DONTWAIT:对于没有可用对等体时(或者所有对等体都具有完全高水位标记)的阻塞的套接字类型(DEALER,PUSH),指定操作应该在非阻塞模式下执行。如果消息不能在套接字上排队,则zmq_msg_send()函数将失败,并将errno设置为EAGAIN。
ZMQ_SNDMORE:指定正在发送的消息是一个多部分消息,并且后续的消息部分将被遵循。有关详细说明,请参阅下面有关多部分消息的部分。
传递给zmq_msg_send()的zmq_msg_t结构在调用期间无效。如果你想发送相同的消息到多个套接字,你必须复制它(例如使用zmq_msg_copy())。
注:成功调用zmq_msg_send()并不表示消息已传输到网络,只是它已在套接字上排队,并且ZMQ已承担该消息的责任。 在成功执行zmq_msg_send()之后,不需要调用zmq_msg_close()。
2.1.4 多部分消息
ZMQ消息由1个或多个消息部分组成。每个消息部分都是独立的zmq_msg_t。
ZMQ确保消息的原子传递:对等体应接收消息的所有消息部分或根本不接收消息。除可用内存以外,消息部分的总数不受限制。发送多部分消息的应用程序必须在发送除最后一部分之外的每个消息部分时使用ZMQ_SNDMORE标志。
2.1.5 返回值
如果成功,zmq_msg_send()函数将返回消息中的字节数。否则它将返回-1并将errno设置为下面定义的值之一。
2.1.6 错误
EAGAIN:请求非阻塞模式,此时不能发送消息。
ENOTSUP:此套接字类型不支持zmq_msg_send()操作。
EINV