名称
zmq_recv - 从一个套接字接收消息部分
概要
int zmq_recv (void '*socket', void '*buf', size_t 'len', int 'flags');
描述
zmq_recv() 函数将从 'socket' 参数引用的套接字接收消息,并将其存储在 'buf' 参数引用的缓冲区中。任何超过 'len' 参数指定长度的字节将被截断。如果在指定的 'socket' 上没有可用的消息,zmq_recv() 函数将阻塞直到请求可以被满足。'flags' 参数是下面定义的标志的组合:如果 len 为零,'buf' 参数可以为 null。
- ZMQ_DONTWAIT
-
指定操作应以非阻塞模式执行。如果在指定的 'socket' 上没有可用的消息,zmq_recv() 函数将失败,并将 'errno' 设置为 EAGAIN。
多部分消息
一个 0MQ 消息由 1 个或多个消息部分组成。0MQ 确保消息的原子性传递:对端将接收到一个消息的全部 消息部分,或者完全不接收。消息部分的总数没有限制,除非受可用内存限制。
处理多部分消息的应用程序必须在调用 zmq_recv() 之后使用 ZMQ_RCVMORE zmq_getsockopt 选项,以确定是否还有更多部分要接收。
返回值
zmq_recv() 函数成功时将返回消息中的字节数。注意,如果消息被截断,该值可能超过 'len' 参数的值。如果失败,函数将返回 -1
并将 'errno' 设置为下面定义的值之一。
错误
- EAGAIN
-
通过套接字选项 ZMQ_RCVTIMEO (参见 zmq_setsockopt) 设置的超时已达到(未设置标志 ZMQ_DONTWAIT),但未能从套接字读取消息;或者当前没有可用的消息(已设置标志 ZMQ_DONTWAIT)且操作将阻塞。
- ENOTSUP
-
此套接字类型不支持 zmq_recv() 操作。
- EFSM
-
当前无法在此套接字上执行 zmq_recv() 操作,因为套接字未处于适当的状态。此错误可能发生在那些在多个状态之间切换的套接字类型上,例如 ZMQ_REP。有关更多信息,请参见 zmq_socket 的 消息模式 部分。
- ETERM
-
与指定的 'socket' 关联的 0MQ 'context' 已终止。
- ENOTSOCK
-
提供的 'socket' 无效。
- EINTR
-
在消息可用之前,操作被信号的传递中断。
示例
char buf [256]; nbytes = zmq_recv (socket, buf, 256, 0); assert (nbytes != -1);
作者
此页面由 0MQ 社区编写。要进行更改,请阅读位于 https://zeromq.cn/how-to-contribute/ 的 0MQ 贡献政策。