名称

zmq_msg_send - 在套接字上发送消息部分

概要

int zmq_msg_send (zmq_msg_t '*msg', void '*socket', int 'flags');

描述

zmq_msg_send() 函数与 zmq_sendmsg 相同,后者将在未来版本中弃用。 zmq_msg_send() 与其他消息操作函数更一致。

zmq_msg_send() 函数应将由参数 'msg' 引用的消息排队,以便发送到由参数 'socket' 引用的套接字。参数 'flags' 是以下定义的标志的组合。

ZMQ_DONTWAIT

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

ZMQ_SNDMORE

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

成功调用后,传递给 zmq_msg_send()zmq_msg_t 结构将被置空。如果您想将同一消息发送到多个套接字,则必须复制它(例如,使用 zmq_msg_copy())。如果调用失败,zmq_msg_t 结构保持完整,必须通过对同一或另一个套接字调用 zmq_msg_send() 来使用,或者使用 zmq_msg_close() 释放以避免内存泄漏。

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

多部分消息

一个 0MQ 消息由 1 个或多个消息部分组成。每个消息部分本身都是一个独立的 'zmq_msg_t'。0MQ 确保消息的原子性投递:对等端将接收到消息的所有消息部分,或者完全不接收任何部分。消息部分的总数不受限制,除了可用内存。

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

返回值

zmq_msg_send() 函数成功时应返回消息中的字节数(如果字节数大于 'MAX_INT',函数将返回 'MAX_INT')。否则应返回 -1 并将 'errno' 设置为以下定义的值之一。

错误

EAGAIN

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

ENOTSUP

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

EINVAL

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

EFSM

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

ETERM

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

ENOTSOCK

提供的 'socket' 无效。

EINTR

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

EFAULT

无效消息。

EHOSTUNREACH

消息无法路由。

示例

填充消息并将其发送到套接字
/* Create a new message, allocating 6 bytes for message content */
zmq_msg_t msg;
int rc = zmq_msg_init_size (&msg, 6);
assert (rc == 0);
/* Fill in message content with 'AAAAAA' */
memset (zmq_msg_data (&msg), 'A', 6);
/* Send the message to the socket */
rc = zmq_msg_send (&msg, socket, 0);
assert (rc == 6);
发送多部分消息
/* Send a multi-part message consisting of three parts to socket */
rc = zmq_msg_send (&part1, socket, ZMQ_SNDMORE);
rc = zmq_msg_send (&part2, socket, ZMQ_SNDMORE);
/* Final part; no more parts to follow */
rc = zmq_msg_send (&part3, socket, 0);

参见

作者

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