名称

zmq_sendmsg - 在套接字上发送消息的一部分

概要

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

说明

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

ZMQ_DONTWAIT

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

ZMQ_SNDMORE

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

传递给 zmq_sendmsg() 的 zmq_msg_t 结构在调用期间将被置空。如果要将同一消息发送到多个套接字,则必须复制它(例如,使用 zmq_msg_copy())。

注意
成功调用 zmq_sendmsg() 并不表示消息已传输到网络,而仅表示它已在 'socket' 上排队,并且 0MQ 已承担消息的责任。
注意
此 API 方法已弃用,请使用 zmq_msg_send(3)。

多部分消息

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

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

返回值

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

错误

EAGAIN

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

ENOTSUP

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

EINVAL

发送方试图发送多部分数据,而此套接字类型不允许这样做。

EFSM

由于套接字当前未处于适当状态,因此无法在此套接字上执行 zmq_sendmsg() 操作。此错误可能发生在会在多种状态之间切换的套接字类型上,例如 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_sendmsg (socket, &msg, 0);
assert (rc == 6);
发送多部分消息
/* Send a multi-part message consisting of three parts to socket */
rc = zmq_sendmsg (socket, &part1, ZMQ_SNDMORE);
rc = zmq_sendmsg (socket, &part2, ZMQ_SNDMORE);
/* Final part; no more parts to follow */
rc = zmq_sendmsg (socket, &part3, 0);

另请参阅

作者

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