ZeroMQ API(三) 消息

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:无效的讯息。

posted @ 2018-04-27 21:28  Memset  阅读(1782)  评论(0编辑  收藏  举报