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()操作。
  EINVAL:发件人试图发送套接字类型不允许的多部分数据。
  EFSM:由于套接字未处于适当状态,此时无法在此套接字上执行zmq_msg_send()操作。使用在几种状态之间切换的套接字类型(例如ZMQ_REP)可能会发生此错误。有关更多信息,请参阅zmq_socket(3)的消息传递模式部分。
  ETERM:与指定套接字关联的ZMQ上下文已终止。
  ENOTSOCK:提供的套接字无效。
  EINTR:信息发送前,信号传递中断了操作。
  EFAULT:无效的讯息。
  EHOSTUNREACH:该消息无法路由。

2.2 zmq_msg_recv(3)

2.2.1 名称

  zmq_msg_recv - 从套接字接收消息部分

2.2.2 概要

  int zmq_msg_recv(zmq_msg_t * msg,void * socket,int flags);

2.2.3 描述

  zmq_msg_recv()函数与zmq_recvmsg(3)相同,在以后的版本中将不推荐使用。 zmq_msg_recv()与其他消息操作函数更加一致。

  zmq_msg_recv()函数将从socket参数引用的套接字接收消息部分,并将其存储在由msg参数引用的消息中。 之前存储在msg中的任何内容应被正确释放。 如果在指定的套接字上没有可用的消息部分,则zmq_msg_recv()函数将被阻塞,直到请求得到满足。 flags参数是下面定义的标志的组合:

  ZMQ_DONTWAIT:指定操作应该在非阻塞模式下执行。 如果指定套接字上没有可用消息,则zmq_msg_recv()函数将失败,并将errno设置为EAGAIN。

2.2.4 多部分消息

  ZMQ消息由1个或多个消息部分组成。每个消息部分都是独立的zmq_msg_t。ZMQ确保消息的原子传递:对等体应接收消息的所有消息部分或根本不接收消息。除可用内存以外,消息部分的总数不受限制。处理多部分消息的应用程序必须在调用zmq_msg_recv()之后使用ZMQ_RCVMORE zmq_getsockopt(3)选项来确定是否还有其他部分要接收。

2.2.5 返回值

  如果成功,zmq_msg_recv()函数将返回消息中的字节数。否则它将返回-1并将errno设置为下面定义的值之一。

2.2.6 错误

  EAGAIN:请求非阻塞模式,目前没有消息可用。
  ENOTSUP:此套接字类型不支持zmq_msg_recv()操作。
  EFSM:由于套接字未处于适当状态,此时无法在此套接字上执行zmq_msg_recv()操作。使用在几种状态之间切换的套接字类型(例如ZMQ_REP)可能会发生此错误。有关更多信息,请参阅zmq_socket(3)的消息传递模式部分。
  ETERM:与指定套接字关联的ZMQ上下文已终止。
  ENOTSOCK:提供的套接字无效。
  EINTR:信息传递之前,该操作被传递信号中断。
  EFAULT:传递给该函数的消息无效。

2.3 zmq_send

2.3.1 名称

  zmq_send - 在套接字上发送消息部分

2.3.2 概要

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

2.3.3 描述

  zmq_send()函数应对从buf和len参数引用的缓冲区创建的消息进行排队。 flags参数是下面定义的标志的组合:

    ZMQ_DONTWAIT:对于没有可用对等体时(或者所有对等体都具有完全高水位标记)的阻塞的套接字类型(DEALER,PUSH),指定操作应该在非阻塞模式下执行。 如果消息不能在套接字上排队,则zmq_send()函数将失败,并将errno设置为EAGAIN。

    ZMQ_SNDMORE:指定正在发送的消息是一个多部分消息,并且后续的消息部分将被遵循。 有关详细说明,请参阅下面有关多部分消息的部分。

  注:成功调用zmq_send()并不表示消息已传输到网络,只是它已在套接字上排队,并且ZMQ已承担了该消息的责任。

2.3.4 多部分消息

  ZMQ消息由1个或多个消息部分组成。 ZMQ确保消息的原子传递:对等体应接收消息的所有消息部分或根本不接收消息。除可用内存以外,消息部分的总数不受限制。发送多部分消息的应用程序必须在发送除最后一部分之外的每个消息部分时使用ZMQ_SNDMORE标志。

2.3.5 返回值

  如果成功,zmq_send()函数将返回消息中的字节数。否则它将返回-1并将errno设置为下面定义的值之一。

2.3.6 错误

  EAGAIN:请求非阻塞模式,此时不能发送消息。
  ENOTSUP:此套接字类型不支持zmq_send()操作。
  EINVAL:发件人试图发送套接字类型不允许的多部分数据。
  EFSM:由于套接字未处于适当状态,此时不能在此套接字上执行zmq_send()操作。使用在几种状态之间切换的套接字类型(例如ZMQ_REP)可能会发生此错误。有关更多信息,请参阅zmq_socket(3)的消息传递模式部分。
  ETERM:与指定套接字关联的ZMQ上下文已终止。
  ENOTSOCK:提供的套接字无效。
  EINTR:信息发送前,信号传递中断了操作。
  EHOSTUNREACH:该消息无法路由。

2.4 zmq_recv

2.4.1 名称

  zmq_recv - 从套接字接收消息部分

2.4.2 概要

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

2.4.3 描述

  zmq_recv()函数将从套接字参数引用的套接字接收消息,并将其存储在由buf参数引用的缓冲区中。任何超过len参数指定长度的字节都应该被截断。如果在指定的套接字上没有可用的消息,则zmq_recv()函数应该阻塞,直到满足请求。 flags参数是下面定义的标志的组合:如果len为零,则buf参数可以为null。

  ZMQ_DONTWAIT:指定操作应该在非阻塞模式下执行。如果指定套接字上没有可用消息,则zmq_recv()函数将失败,并将errno设置为EAGAIN。

2.4.4 多部分消息

  ZMQ消息由1个或多个消息部分组成。 ZMQ确保消息的原子传递:对等体应接收消息的所有消息部分或根本不接收消息。除可用内存以外,消息部分的总数不受限制。

  处理多部分消息的应用程序必须在调用zmq_recv()之后使用ZMQ_RCVMORE zmq_getsockopt(3)选项来确定是否还有其他部分要接收。

2.4.5 返回值

  如果成功,zmq_recv()函数将返回消息中的字节数。请注意,如果邮件被截断,该值可能会超过len参数的值。如果不成功,函数将返回-1并将errno设置为下面定义的值之一。

2.4.6 错误

  EAGAIN:请求非阻塞模式,目前没有消息可用。
  ENOTSUP:此套接字类型不支持zmq_recv()操作。
  EFSM:由于套接字未处于适当状态,此时无法在此套接字上执行zmq_recv()操作。使用在几种状态之间切换的套接字类型(例如ZMQ_REP)可能会发生此错误。有关更多信息,请参阅zmq_socket(3)的消息传递模式部分。
  ETERM:与指定套接字关联的ZMQ上下文已终止。
  ENOTSOCK:提供的套接字无效。
  EINTR:信息传递之前,该操作被传递信号中断。

2.5 zmq_send_const

2.5.1 名称

  zmq_send_const - 在套接字上发送一个常量内存消息部分

2.5.2 概要

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

2.5.3 描述

  zmq_send_const()函数将对由buf和len参数引用的缓冲区创建的消息进行排队。 消息缓冲区被假定为常量内存,因此不会被以任何方式复制或解除分配。

  flags参数是下面定义的标志的组合:

    ZMQ_DONTWAIT:对于没有可用对等体时(或者所有对等体都具有完全高水位标记)的阻塞的套接字类型(DEALER,PUSH),指定操作应该在非阻塞模式下执行。 如果消息不能在套接字上排队,则zmq_send_const()函数将失败,并将errno设置为EAGAIN。

    ZMQ_SNDMORE:指定正在发送的消息是一个多部分消息,并且后续的消息部分将被遵循。 有关详细说明,请参阅下面有关多部分消息的部分。

  注:成功调用zmq_send_const()并不表示消息已传输到网络,只是它已在套接字上排队,并且ZMQ已承担该消息的责任。

2.5.4 多部分消息

  ZMQ消息由1个或多个消息部分组成。 ZMQ确保消息的原子传递:对等体应接收消息的所有消息部分或根本不接收消息。除可用内存以外,消息部分的总数不受限制。

  发送多部分消息的应用程序必须在发送除最后一部分之外的每个消息部分时使用ZMQ_SNDMORE标志。

2.5.5 返回值

  如果成功,zmq_send_const()函数将返回消息中的字节数。否则它将返回-1并将errno设置为下面定义的值之一。

2.5.6 错误

  EAGAIN:请求非阻塞模式,此时不能发送消息。
  ENOTSUP:此套接字类型不支持zmq_send_const()操作。
  EFSM:由于套接字未处于适当状态,此时不能在此套接字上执行zmq_send_const()操作。使用在几种状态之间切换的套接字类型(例如ZMQ_REP)可能会发生此错误。有关更多信息,请参阅zmq_socket(3)的消息传递模式部分。
  ETERM:与指定套接字关联的ZMQ上下文已终止。
  ENOTSOCK:提供的套接字无效。
  EINTR:信息发送前,信号传递中断了操作。
  EHOSTUNREACH:该消息无法路由。

2.6 zmq_recvmsg(废弃)

2.6.1 名称

  zmq_recvmsg - 从套接字接收消息部分

2.6.2 概要

  int zmq_recvmsg(void * socket,zmq_msg_t * msg,int flags);

2.6.3 描述

  zmq_recvmsg()函数将从socket参数引用的套接字接收消息部分,并将其存储在由msg参数引用的消息中。 之前存储在msg中的任何内容应被正确释放。 如果在指定套接字上没有可用的消息部分,则zmq_recvmsg()函数应该阻塞,直到请求得到满足。 flags参数是下面定义的标志的组合:

  ZMQ_DONTWAIT:指定操作应该在非阻塞模式下执行。 如果指定套接字上没有可用消息,则zmq_recvmsg()函数将失败,并将errno设置为EAGAIN。

  注:此API方法已弃用,以支持zmq_msg_recv(3)。

2.6.4 多部分消息

  ZMQ消息由1个或多个消息部分组成。每个消息部分都是独立的zmq_msg_t。 ZMQ确保消息的原子传递:对等体应接收消息的所有消息部分或根本不接收消息。除可用内存以外,消息部分的总数不受限制。处理多部分消息的应用程序必须在调用zmq_recvmsg()之后使用ZMQ_RCVMORE zmq_getsockopt(3)选项来确定是否还有其他部分要接收。

2.6.5 返回值

  如果成功,zmq_recvmsg()函数将返回消息中的字节数。否则它将返回-1并将errno设置为下面定义的值之一。

2.6.6 错误

  EAGAIN:请求非阻塞模式,目前没有消息可用。
  ENOTSUP:此套接字类型不支持zmq_recvmsg()操作。
  EFSM:由于套接字未处于适当状态,此时不能在此套接字上执行zmq_recvmsg()操作。使用在几种状态之间切换的套接字类型(例如ZMQ_REP)可能会发生此错误。有关更多信息,请参阅zmq_socket(3)的消息传递模式部分。
  ETERM:与指定套接字关联的ZMQ上下文已终止。
  ENOTSOCK:提供的套接字无效。
  EINTR:信息传递之前,该操作被传递信号中断。
  EFAULT:传递给该函数的消息无效。

2.7 zmq_sendmsg(废弃)

2.7.1 名称

  zmq_sendmsg - 在套接字上发送消息部分

2.7.2 概要

  int zmq_sendmsg(void * socket,zmq_msg_t * msg,int flags);

2.7.3 描述

  zmq_sendmsg()函数应该将由msg参数引用的消息排队,以便发送到由socket参数引用的套接字。 flags参数是下面定义的标志的组合:

    ZMQ_DONTWAIT:对于没有可用对等体时(或者所有对等体都具有完全高水位标记)的阻塞的套接字类型(DEALER,PUSH),指定操作应该在非阻塞模式下执行。如果消息不能在套接字上排队,则zmq_sendmsg()函数将失败,并将errno设置为EAGAIN。

    ZMQ_SNDMORE:指定正在发送的消息是一个多部分消息,并且后续的消息部分将被遵循。有关详细说明,请参阅下面有关多部分消息的部分。

  传递给zmq_sendmsg()的zmq_msg_t结构在调用期间无效。如果你想发送相同的消息到多个套接字,你必须复制它(例如使用zmq_msg_copy())。

  注:成功调用zmq_sendmsg()并不表示消息已传输到网络,只是它已在套接字上排队,并且ZMQ已承担该消息的责任。

  此API方法已弃用,以支持zmq_msg_send(3)。

2.7.4 多部分消息

  ZMQ消息由1个或多个消息部分组成。每个消息部分都是独立的zmq_msg_t。 ZMQ确保消息的原子传递:对等体应接收消息的所有消息部分或根本不接收消息。除可用内存以外,消息部分的总数不受限制。发送多部分消息的应用程序必须在发送除最后一部分之外的每个消息部分时使用ZMQ_SNDMORE标志。

2.7.5 返回值

  如果成功,zmq_sendmsg()函数将返回消息中的字节数。否则它将返回-1并将errno设置为下面定义的值之一。

2.7.6 错误

  EAGAIN:请求非阻塞模式,此时不能发送消息。
  ENOTSUP:此套接字类型不支持zmq_sendmsg()操作。
  EINVAL:发件人试图发送套接字类型不允许的多部分数据。
  EFSM:由于套接字未处于适当的状态,此时不能在此套接字上执行zmq_sendmsg()操作。使用在几种状态之间切换的套接字类型(例如ZMQ_REP)可能会发生此错误。有关更多信息,请参阅zmq_socket(3)的消息传递模式部分。
  ETERM:与指定套接字关联的ZMQ上下文已终止。
  ENOTSOCK:提供的套接字无效。
  EINTR:信息发送前,信号传递中断了操作。
  EFAULT:无效的讯息。
  EHOSTUNREACH:该消息无法路由。

3、关闭消息

3.1 zmq_msg_close(3)

3.1.1 名称

  zmq_msg_close - 释放ZMQ消息

3.1.2 概要

  int zmq_msg_close(zmq_msg_t * msg);

3.1.3 描述

  zmq_msg_close()函数应通知ZMQ基础设施:与msg引用的消息对象相关联的任何资源不再需要并可以被释放。 与消息对象相关的资源的实际释放应由ZMQ推迟,直到消息或基础数据缓冲区的所有用户都表示不再需要为止。一旦消息不再需要,应用程序应确保调用zmq_msg_close(),否则可能会发生内存泄漏。 请注意,在成功执行zmq_msg_send()后,这不是必需的。切勿直接访问zmq_msg_t成员,而应始终使用zmq_msg系列函数。

3.1.4 返回值

  如果成功,zmq_msg_close()函数将返回零。 否则它将返回-1并将errno设置为下面定义的值之一。

3.1.5 错误

  EFAULT:无效的讯息。

4、访问消息内容

4.1 zmq_msg_data(3)

4.1.1 名称

  zmq_msg_data - 检索指向消息内容的指针

4.1.2 概要

void * zmq_msg_data(zmq_msg_t * msg);

4.1.3 描述

  zmq_msg_data()函数将返回一个指向由msg引用的消息对象的消息内容的指针。切勿直接访问zmq_msg_t成员,而应始终使用zmq_msg系列函数。

4.1.4 返回值

  成功完成后,zmq_msg_data()应返回一个指向消息内容的指针。

4.1.5 错误

  没有定义错误。

4.2 zmq_msg_size(3)

4.2.1 名称

  zmq_msg_size - 以字节为单位检索邮件内容大小

4.2.2 概要

  size_t zmq_msg_size(zmq_msg_t * msg);

4.2.3 描述

  zmq_msg_size()函数将返回由msg引用的消息对象内容的大小(以字节为单位)。切勿直接访问zmq_msg_t成员,而应始终使用zmq_msg系列函数。

4.2.4 返回值

  成功完成后,zmq_msg_size()应以字节为单位返回消息内容的大小。

4.2.5 错误

  没有定义错误。

4.3 zmq_msg_more(3)

4.3.1 名称

  zmq_msg_more - 指示是否有更多的消息部分要接收

4.3.2 概要

  int zmq_msg_more(zmq_msg_t * message);

4.3.3 描述

  zmq_msg_more()函数指示这是否是多部分消息的一部分,并且还有其他部分可以接收。 这个方法可以在zmq_msg_close()之后被安全地调用。 此方法与zmq_msg_get()的参数相同,参数为ZMQ_MORE。

4.3.4 返回值

  如果这是多部分消息的最后部分,或者是单部分消息的唯一部分,则zmq_msg_more()函数应该返回零。 如果还有其他零件需要收到,它将返回1。

5、使用消息属性

5.1 zmq_msg_gets(3)

5.1.1 名称

  zmq_msg_gets - 获取消息元数据属性

5.1.2 概要

  const char * zmq_msg_gets(zmq_msg_t * message,const char * property);

5.1.3 描述

  zmq_msg_gets()函数将返回由message参数指向的消息的属性参数指定的元数据属性的字符串值。 属性参数和值都是以NULL结尾的UTF8编码的字符串。如<rfc.zeromq.org/spec:37>中所指定的,在ZeroMQ连接握手期间,元数据在每个连接的基础上定义。
可以使用zmq_msg_gets()函数检索以下ZMTP属性:

  Socket-Type
  Identity
  Resource

  此外,当可用于底层传输时,Peer-Address属性将返回由getnameinfo(2)返回的远程端点的IP地址。其他属性可以基于基础安全机制来定义,请参见下面的ZAP认证连接示例。

5.1.4 返回值

  如果成功,zmq_msg_gets()函数将返回属性的字符串值。 否则它将返回NULL并将errno设置为下面定义的值之一。 调用者不得修改或释放返回值,该值将由消息拥有。 属性和值的编码应为UTF8。

5.1.5 错误

  EINVAL:所要求的属性是未知的。

5.2 zmq_msg_get(3)

5.2.1 名称

  zmq_msg_get - 获取消息属性

5.2.2 概要

  int zmq_msg_get(zmq_msg_t * message,int property);

5.2.3描述

  zmq_msg_get()函数将返回由message参数指向的消息的属性参数指定的属性的值。

  可以使用zmq_msg_get()函数检索以下属性:

  ZMQ_MORE:表示在消息之后有更多的消息帧。
  ZMQ_SRCFD:返回从中读取消息的套接字的文件描述符。这允许应用程序通过getpeername(2)检索远程端点。请注意,相应的套接字可能已经关闭,甚至重复使用。目前仅适用于TCP套接字。
  ZMQ_SHARED:指示消息可以与此消息的另一个副本共享底层存储。

5.2.4 返回值

  如果成功,zmq_msg_get()函数将返回属性的值。否则它将返回-1并将errno设置为下面定义的值之一。

5.2.5 错误

  EINVAL:所要求的属性是未知的。

5.3 zmq_msg_set(3)

5.3.1 名称

  zmq_msg_set - 设置消息属性

5.3.2 概要

  int zmq_msg_set(zmq_msg_t * message,int property,int value);

5.3.3 描述

  zmq_msg_set()函数应将property参数指定的属性设置为message参数指向的ZMQ消息片段的value参数的值。目前,zmq_msg_set()函数不支持任何属性名称。

5.3.4 返回值

  如果成功,zmq_msg_set()函数将返回零。 否则它将返回-1并将errno设置为下面定义的值之一。

5.3.5 错误

  EINVAL:所要求的属性不明。

6、消息操作

6.1 zmq_msg_copy(3)

6.1.1 名称

  zmq_msg_copy - 将消息的内容复制到另一个消息

6.1.2 概要

  int zmq_msg_copy(zmq_msg_t * dest,zmq_msg_t * src);

6.1.3 描述

  zmq_msg_copy()函数应将由src引用的消息对象复制到由dest引用的消息对象。 dest的原始内容,如果有的话,应该被释放。复制之前,您必须初始化dest。实现可以选择不物理复制消息内容,而是在src和dest之间共享底层缓冲区。使用zmq_msg_copy()复制消息后,请避免修改消息内容,否则可能会导致未定义的行为。如果您需要的是实际的硬拷贝,请使用zmq_msg_init_size()分配新消息,并使用memcpy()复制消息内容。切勿直接访问zmq_msg_t成员,而应始终使用zmq_msg系列函数。

6.1.4 返回值

  如果成功,zmq_msg_copy()函数将返回零。否则它将返回-1并将errno设置为下面定义的值之一。

6.1.5 错误

  EFAULT:无效的讯息。

6.2 zmq_msg_move(3)

6.2.1 名称

  zmq_msg_move - 将消息的内容移动到另一个消息

6.2.2 概要

  int zmq_msg_move(zmq_msg_t * dest,zmq_msg_t * src);

6.2.3 描述

  zmq_msg_move()函数应将由src引用的消息对象的内容移动到由dest引用的消息对象。 不执行消息内容的实际复制,只是更新dest以引用新内容。 调用zmq_msg_move()后,src将变为空信息。 dest的原始内容,如果有的话,应该被释放。切勿直接访问zmq_msg_t成员,而应始终使用zmq_msg系列函数。

6.2.4 返回值

  如果成功,zmq_msg_move()函数将返回零。 否则它将返回-1并将errno设置为下面定义的值之一。

6.2.5 错误

  EFAULT:无效的讯息。

ZeroMQ API(三) 消息的更多相关文章

  1. ZeroMQ API(一) 总序

    序 zeromq是一个轻量级的消息库.它扩展了标准的套接字接口,其特性与传统的消息中间件不同,zeromq提供异步消息队列.多消息传递模式.消息过滤(订阅).无缝访问多个传输协议等的抽象. 本系列AP ...

  2. 用JSON-server模拟REST API(三) 进阶使用

    用JSON-server模拟REST API(三) 进阶使用 前面演示了如何安装并运行 json server , 和使用第三方库真实化模拟数据 , 下面将展开更多的配置项和数据操作. 目录: 配置项 ...

  3. Express4.x API (三):Response (译)

    Express4.x API 译文 系列文章 Express4.x API (一):application (译) -- 完成 Express4.x API (二):request (译) -- 完成 ...

  4. RabbitMQ(三):消息持久化策略

    原文:RabbitMQ(三):消息持久化策略 一.前言 在正常的服务器运行过程中,时常会面临服务器宕机重启的情况,那么我们的消息此时会如何呢?很不幸的事情就是,我们的消息可能会消失,这肯定不是我们希望 ...

  5. java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))

    1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...

  6. 了解HTML5和“她”的 API (三)

    Web Workers(后台线程) JavaScript是单线程的,较长的javascript运算会阻塞UI线程. web worker 是运行在后台的 JavaScript,不会影响页面的性能. 在 ...

  7. ZeroMQ API(五) 传输模式

    1.使用TCP的单播传输:zmq_tcp(7) 1.1 名称 zmq_tcp - 使用TCP的ZMQ单播传输 1.2 概要 TCP是一种无处不在,可靠的单播传输.当通过具有ZMQ的网络连接分布式应用程 ...

  8. 快速掌握RabbitMQ(三)——消息确认、持久化、优先级的C#实现

    1 消息确认 在一些场合,如转账.付费时每一条消息都必须保证成功的被处理.AMQP是金融级的消息队列协议,有很高的可靠性,这里介绍在使用RabbitMQ时怎么保证消息被成功处理的.消息确认可以分为两种 ...

  9. Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作

    1. 滑动和拖拽 我们在做自动化测试的时候,有些按钮是需要滑动几次屏幕后才会出现,此时,我们需要使用代码来模拟手指的滑动,也就是接下来要学的滑动和拖拽了. 1.1 swipe滑动事件 从一个坐标位置滑 ...

随机推荐

  1. 【奇奇怪怪的bug系列】微信小程序

    今天修改代码的时候,发现了一件让我很恐慌的事情,在app.json中修改页面路径顺序不起作用了: 这样我根本就看不到页面的效果啊??? 在折腾了半天后,才发现是一个比较乌龙的事情:昨天修改完首页后顺手 ...

  2. C#编程之神奇程序找数

    C#编程之神奇程序找数 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间精确到分 ...

  3. 第三周作业(一)VS安装及单元测试练习

    第三周作业(一) 需求:练习教科书第22~25页单元测试练习,要求自行安装Visual Studio开发平台,版本至少在2010以上,要求把程序安装过程和练习过程写到博客上,越详细越好,要图文并茂,没 ...

  4. 使用JavascriptExecutor将页面滚动到最底部

    使用如下代码,将页面滚动到最底部 @Test(enabled = true) public void scroll(){ String jsStr="window.scrollTo(0,do ...

  5. localStorage存储数组,对象,localStorage,sessionStorage存储数组对象

    localStorage存储数组,对象,localStorage,sessionStorage存储数组对象   前言 最近在用angular做商城购物车的功能模块,因为angular的watch监听, ...

  6. pygame学习笔记(6)——一个超级简单的游戏

    转载请注明:@小五义  http://www.cnblogs.com/xiaowuyi 学了这么长时间的Pygame,一直想写个游戏实战一下.看起来很简单的游戏,写其来怎么这么难.最初想写个俄罗斯方块 ...

  7. redis哨兵机制二(转)

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如 master宕机了,Redis本身(包括它的很多客户端) ...

  8. VBA笔记(一)——基础配置

    开启VBA编程环境——VBE 方法一:按<Alt+F11>组合建 方法二:查看代码 宏设置 当然启用宏的设置方式不同,宏的启动方式也不一样. 首先打开“office 按钮”,选择“exce ...

  9. Hadoop 2.6.0 HIVE 2.1.1配置

    我用的hadoop 是2.6.0 版本 ,hive 是 2.1.1版本进入:/home/zkpk/apache-hive-2.1.1-bin/执行hive 后报错: (1)Exception in t ...

  10. linux系统日志__ratelimit: N callbacks suppressed

    报错 今天线上遇到故障,php进行因为段错误退出了,系统日志中的kernel报错如下: Feb 25 22:25:11 web_server_01 kernel: __ratelimit: 250 c ...