名称

zmq_send - 在一个套接字上发送消息部分

概要

int zmq_send (void *socket, const void *buf, size_t len, int flags);

说明

zmq_send() 函数将把根据 'buf' 和 'len' 参数引用的缓冲区创建的消息排入队列。'flags' 参数是下面定义的标志的组合

ZMQ_DONTWAIT

对于会阻塞的套接字类型 (DEALER, PUSH) (无论是因为设置了 ZMQ_IMMEDIATE 选项且没有可用对等端,还是所有对等端的队列都达到了高水位线),指定操作应以非阻塞模式执行。如果消息无法在 'socket' 上排队,zmq_send() 函数将失败,并设置 'errno' 为 EAGAIN。

ZMQ_SNDMORE

指定正在发送的消息是多部分消息,并且后面还会跟有更多的消息部分。详细描述请参考下面关于多部分消息的部分。

注意
成功调用 zmq_send() 并不表示消息已经传输到网络,仅表示它已在 'socket' 上排队,并且 0MQ 已承担该消息的责任。

多部分消息

一个 0MQ 消息由 1 个或多个消息部分组成。0MQ 确保消息的原子性交付:对等端将接收到一个消息的所有 消息部分,或者完全不接收。消息部分的总数没有限制,除非受可用内存限制。

发送多部分消息的应用程序在发送除最后一个消息部分以外的每个部分时,必须使用 ZMQ_SNDMORE 标志。

返回值

如果成功,zmq_send() 函数将返回消息中的字节数。否则,它将返回 -1 并将 'errno' 设置为下面定义的值之一。

错误

EAGAIN

请求了非阻塞模式,但消息目前无法发送。

ENOTSUP

此套接字类型不支持 zmq_send() 操作。

EINVAL

发送者尝试发送多部分数据,但此套接字类型不允许。

EFSM

由于套接字当前未处于适当状态,无法执行 zmq_send() 操作。此错误可能发生在会在几种状态之间切换的套接字类型上,例如 ZMQ_REP。更多信息请参阅 zmq_socket消息模式 部分。

ETERM

与指定的 'socket' 相关联的 0MQ 'context' 已终止。

ENOTSOCK

提供的 'socket' 无效。

EINTR

在消息发送之前,操作被信号传递中断。

EHOSTUNREACH

消息无法路由。

示例

发送多部分消息
/* Send a multi-part message consisting of three parts to socket */
rc = zmq_send (socket, "ABC", 3, ZMQ_SNDMORE);
assert (rc == 3);
rc = zmq_send (socket, "DEFGH", 5, ZMQ_SNDMORE);
assert (rc == 5);
/* Final part; no more parts to follow */
rc = zmq_send (socket, "JK", 2, 0);
assert (rc == 2);

另请参阅

作者

此页面由 0MQ 社区撰写。要进行修改,请阅读 0MQ 贡献政策,地址为 https://zeromq.cn/how-to-contribute/