名称

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/