名称
zmq_recvmsg - 从套接字接收消息帧
概要
int zmq_recvmsg (void '*socket', zmq_msg_t '*msg', int 'flags');
描述
zmq_recvmsg() 函数从 'socket' 参数引用的套接字接收一个消息帧,并将其存储在 'msg' 参数引用的消息中。之前存储在 'msg' 中的任何内容都将被正确释放。如果指定的 'socket' 上没有可用的消息帧,zmq_recvmsg() 函数将阻塞,直到请求得到满足。'flags' 参数是以下定义的标志的组合:
- ZMQ_DONTWAIT
-
指定操作应以非阻塞模式执行。如果在指定的 'socket' 上没有可用的消息,zmq_recvmsg() 函数将失败,并将 'errno' 设置为 EAGAIN。
注意
|
此 API 方法已废弃,推荐使用 zmq_msg_recv(3)。 |
多部分消息
一个 0MQ 消息由 1 个或多个消息帧组成。每个消息帧本身都是一个独立的 'zmq_msg_t'。0MQ 确保消息的原子性传递:对等方将接收消息的所有消息帧,或根本不接收。消息帧的总数仅受可用内存的限制。
处理多部分消息的应用程序在调用 zmq_recvmsg() 后必须使用 ZMQ_RCVMORE zmq_getsockopt 选项来确定是否还有更多部分需要接收。
返回值
zmq_recvmsg() 函数成功时返回消息中的字节数。否则,它将返回 -1
并将 'errno' 设置为以下定义的值之一。
错误
- EAGAIN
-
通过套接字选项 ZMQ_RCVTIMEO (参见 zmq_setsockopt) 设置的超时已到达 (未设置标志 ZMQ_DONTWAIT),但未能从套接字读取到消息;或者当前没有可用的消息 (设置了标志 ZMQ_DONTWAIT),且操作会阻塞。
- ENOTSUP
-
此套接字类型不支持 zmq_recvmsg() 操作。
- EFSM
-
由于套接字未处于适当的状态,当前无法在此套接字上执行 zmq_recvmsg() 操作。此类错误可能发生在会在多种状态之间切换的套接字类型上,例如 ZMQ_REP。更多信息请参见 zmq_socket 的 消息模式 (messaging patterns) 部分。
- ETERM
-
与指定的 'socket' 关联的 0MQ 'context' 已被终止。
- ENOTSOCK
-
提供的 'socket' 无效。
- EINTR
-
在消息可用之前,操作被信号传递中断。
- EFAULT
-
传递给函数的 संदेश (message) 无效。
示例
/* 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_recvmsg (socket, &msg, 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_recvmsg (socket, &part, 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/。