名称
zmq_msg_recv - 从套接字接收消息部分
概要
int zmq_msg_recv (zmq_msg_t '*msg', void '*socket', int 'flags');
描述
zmq_msg_recv() 函数与 zmq_recvmsg 函数相同,后者将在未来版本中弃用。zmq_msg_recv() 与其他消息操作函数更一致。
zmq_msg_recv() 函数将从 'socket' 参数引用的套接字接收一个消息部分,并将其存储在 'msg' 参数引用的消息中。先前存储在 'msg' 中的任何内容都将被正确释放。如果指定的 'socket' 上没有可用的消息部分,zmq_msg_recv() 函数将阻塞直到请求可以满足。'flags' 参数是以下定义标志的组合:
- ZMQ_DONTWAIT
-
指定操作应以非阻塞模式执行。如果指定的 'socket' 上没有可用的消息,zmq_msg_recv() 函数将失败,并将 'errno' 设置为 EAGAIN。
多部分消息
0MQ 消息由 1 个或多个消息部分组成。每个消息部分本身都是一个独立的 'zmq_msg_t'。0MQ 确保消息的原子传递:对端要么接收到消息的所有消息部分,要么一个也接收不到。消息部分的总体数量不受限制,除非可用内存不足。
处理多部分消息的应用程序在调用 zmq_msg_recv() 后必须使用 ZMQ_RCVMORE zmq_getsockopt 选项来确定是否还有更多部分需要接收。
返回值
如果成功,zmq_msg_recv() 函数将返回消息的字节数。否则,它将返回 -1
并将 'errno' 设置为以下定义的值之一。
错误
- EAGAIN
-
通过套接字选项 ZMQ_RCVTIMEO(参见 zmq_setsockopt)设置的超时已到达(未设置 ZMQ_DONTWAIT 标志)但未能从套接字读取消息,或者当前没有可用的消息(已设置 ZMQ_DONTWAIT 标志)并且操作会阻塞。
- ENOTSUP
-
此套接字类型不支持 zmq_msg_recv() 操作。
- EFSM
-
由于套接字未处于适当状态,目前无法在此套接字上执行 zmq_msg_recv() 操作。对于在多种状态之间切换的套接字类型(例如 ZMQ_REP),可能会发生此错误。有关更多信息,请参见 zmq_socket 的消息模式部分。
- ETERM
-
与指定 'socket' 关联的 0MQ 'context' 已终止。
- ENOTSOCK
-
提供的 'socket' 无效。
- EINTR
-
在消息可用之前,操作被信号的传递中断。
- EFAULT
-
传递给函数的消息无效。
示例
/* Create an empty 0MQ message */ zmq_msg_t msg; int rc = zmq_msg_init (&msg); assert (rc == 0); /* Block until a message is available to be received from socket */ rc = zmq_msg_recv (&msg, socket, 0); assert (rc != -1); /* Release message */ zmq_msg_close (&msg);
int more; size_t more_size = sizeof (more); do { /* Create an empty 0MQ message to hold the message part */ zmq_msg_t part; int rc = zmq_msg_init (&part); assert (rc == 0); /* Block until a message is available to be received from socket */ rc = zmq_msg_recv (&part, socket, 0); assert (rc != -1); /* Determine if more message parts are to follow */ rc = zmq_getsockopt (socket, ZMQ_RCVMORE, &more, &more_size); assert (rc == 0); zmq_msg_close (&part); } while (more);
作者
此页面由 0MQ 社区编写。要进行更改,请阅读 0MQ 贡献政策,网址为 https://zeromq.cn/how-to-contribute/。