名称

zmq_send_const - 在套接字上发送常量内存消息部分

概要

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

描述

zmq_send_const() 函数将把通过参数 'buf' 和 'len' 引用的缓冲区创建的消息进行排队。假定该消息缓冲区是常量内存的,因此不会以任何方式被复制或释放。参数 'flags' 是以下定义的标志的组合:

ZMQ_DONTWAIT

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

ZMQ_SNDMORE

指定正在发送的消息是多部分消息,并且后续还有更多的消息部分。有关详细说明,请参阅下面关于多部分消息的部分。

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

多部分消息

一个 0MQ 消息由 1 个或多个消息部分组成。0MQ 确保消息的原子性投递:对端将接收到消息的 *所有部分*,或者完全接收不到。消息部分的 总数是无限的,除非可用内存耗尽。

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

返回值

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

错误

EAGAIN

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

ENOTSUP

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

EFSM

由于套接字未处于适当的状态,zmq_send_const() 操作当前无法在此套接字上执行。此错误可能发生在某些在多个状态之间切换的套接字类型上,例如 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_const (socket, "ABC", 3, ZMQ_SNDMORE);
assert (rc == 3);
rc = zmq_send_const (socket, "DEFGH", 5, ZMQ_SNDMORE);
assert (rc == 5);
/* Final part; no more parts to follow */
rc = zmq_send_const (socket, "JK", 2, 0);
assert (rc == 2);

另请参阅

作者

本页由 0MQ 社区编写。要进行更改,请阅读以下地址的 0MQ 贡献策略:https://zeromq.cn/how-to-contribute/