名称
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/。