名称

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/