ZeroMQ API(四) 套接字
1、创建一个套接字
1.1 zmq_socket(3)
1.1.1 名称
zmq_socket - 创建ZMQ套接字
1.1.2 概要
void * zmq_socket(void * context,int type);
1.1.3 描述
zmq_socket()函数将在指定的上下文中创建一个ZMQ套接字,并向新创建的套接字返回一个不透明的句柄。 type参数指定套接字类型,它确定套接字通信的语义。
新创建的套接字最初是未绑定的,并且不与任何端点关联。为了建立消息流,套接字必须首先使用zmq_connect(3)连接到至少一个端点,或者必须创建至少一个端点以接受与zmq_bind(3)的传入连接。
1.1.3.1 与传统套接字的主要区别
一般来说,传统套接字为面向连接的可靠字节流(SOCK_STREAM)或无连接不可靠数据报(SOCK_DGRAM)提供同步接口。相比之下,ZMQ套接字提供了一个异步消息队列的抽象,具有确切的排队语义取决于使用的套接字类型。传统套接字传输字节流或离散数据报时,ZMQ套接字传输离散消息。
ZMQ套接字是异步的,意味着物理连接建立和拆除,重新连接和有效传输的时间对用户是透明的,并由ZMQ自己组织。此外,消息可能在对等体不可用以接收它们的情况下排队。
传统套接字只允许严格的一对一(两个对等体),多对一(多个客户机,一个服务器),或者在某些情况下允许一对多(多播)关系。除ZMQ_PAIR之外,ZMQ套接字可以使用zmq_connect()连接到多个端点,同时使用zmq_bind()接受来自绑定到该套接字的多个端点的传入连接,从而允许多对多关系。
1.1.3.2 线程安全
ZMQ套接字不是线程安全的。应用程序绝不能使用来自多个线程的套接字,除非在将套接字从一个线程迁移到另一个线程的情况下具有“完全围栅”内存屏障。
1.1.3.3 套接字类型
以下部分介绍由ZMQ定义的套接字类型,按照由相关套接字类型构建的常规消息传递模式进行分组。
1.1.3.3.1 请求 - 回复模式
请求 - 应答模式用于从ZMQ_REQ客户端向一个或多个ZMQ_REP服务发送请求,并接收对发送的每个请求的后续回复。请求 - 答复模式由http://rfc.zeromq.org/spec:28正式定义。
ZMQ_REQ
客户端使用ZMQ_REQ类型的套接字向服务发送请求并从服务接收回复。 此套接字类型只允许交换zmq_send(请求)和随后的zmq_recv(应答)调用序列。 发送的每个请求都是在所有服务中进行的,并且每个收到的回复都与上次发出的请求相匹配。
如果没有可用的服务,则套接字上的任何发送操作都应阻塞,直到至少有一项服务可用。 REQ套接字不应丢弃消息。
ZMQ_REQ特性总结
ZMQ_REP 兼容的对等套接字 ZMQ_REP,ZMQ_ROUTER
方向 双向
发送/接收模式 发送,接收,发送,接收,...
出路由策略 循环
传入路由策略 最后一个peer
静音状态下的动作 Block
ZMQ_REP
服务使用类型为ZMQ_REP的套接字接收来自客户端的请求并将其发送给客户端。 此套接字类型只允许交换zmq_recv(请求)和随后的zmq_send(回复)调用序列。 收到的每个请求均从所有客户端公平排队,并且每个发送的回复都路由到发出最后请求的客户端。 如果原始请求者不再存在,则回复将被无声丢弃。
ZMQ_REP特性总结
兼容的对等套接字 ZMQ_REQ,ZMQ_DEALER
方向 双向
发送/接收模式 接收,发送,接收,发送,...
传入路由策略 公平排队
外出路由策略 最后一个同伴
ZMQ_DEALER
ZMQ_DEALER类型的套接字是用于扩展请求/回复套接字的高级模式。 发送的每条消息在所有连接的对等体中都是全局消息传递的,并且每个收到的消息都从所有连接的对等体公平排队。
当ZMQ_DEALER套接字由于达到所有对等体的高水位而进入静音状态或者根本没有对等体时,套接字上的任何zmq_send(3)操作都应阻塞,直到静音状态结束或至少一个 对等体可用于发送; 消息不会被丢弃。
当一个ZMQ_DEALER套接字连接到一个ZMQ_REP套接字时,每个发送的消息必须包含一个空的消息部分,分隔符,后跟一个或多个正文部分。
ZMQ_DEALER特性摘要
兼容的对等套接字 ZMQ_ROUTER,ZMQ_REP,ZMQ_DEALER
方向 双向
发送/接收模式 不受限制
出路由策略 循环
传入路由策略 公平排队
静音状态下的动作 Block
ZMQ_ROUTER
ZMQ_ROUTER类型的套接字是用于扩展请求/回复套接字的高级套接字类型。当接收到消息时,ZMQ_ROUTER套接字在将消息传递给应用程序之前,应该将包含消息始发节点身份的消息部分添加到消息中。收到的消息从所有连接的对等体中公平排队。发送消息时,ZMQ_ROUTER套接字应删除消息的第一部分,并用它来确定消息应被路由到的对等体的身份。如果对等体不再存在,默认情况下将默认丢弃该消息,除非ZMQ_ROUTER_MANDATORY套接字选项设置为1。
当ZMQ_ROUTER套接字由于达到所有对等体的高水位而进入静音状态时,发送到套接字的任何消息都应该被丢弃,直到静音状态结束。同样,除非设置了ZMQ_ROUTER_MANDATORY套接字选项,否则路由到已达到单个高位标记的对等方的任何消息也将被丢弃。
当一个ZMQ_REQ套接字连接到一个ZMQ_ROUTER套接字时,除了始发节点的身份外,每个收到的消息都应该包含一个空的定界符消息部分。因此,应用程序所看到的每个接收到的消息的整个结构变成:一个或多个标识部分,定界符部分,一个或多个身体部分。当将回复发送到ZMQ_REQ套接字时,应用程序必须包含分隔符部分。
ZMQ_ROUTER特性总结
兼容对等套接字 ZMQ_DEALER,ZMQ_REQ,ZMQ_ROUTER
方向 双向
发送/接收模式 不受限制
传出路由策略 查看文本
传入路由策略 外播队列
静音状态下的动作 丢弃(请参阅文本)
1.1.3.3.2 发布 - 订阅模式
发布 - 订阅模式用于以扇出方式从单个发布者到多个订阅者的一对多数据分发。发布 - 订阅模式由http://rfc.zeromq.org/spec:29正式定义。
ZMQ_PUB
发布者使用类型为ZMQ_PUB的套接字来分发数据。 发送的消息以扇形方式分发给所有连接的对等体。 此套接字类型未实现zmq_recv(3)函数。
当ZMQ_PUB套接字由于达到用户的高水位而进入静音状态时,任何发送给该用户的消息都应该被丢弃,直到静音状态结束。 zmq_send()函数不会为此套接字类型阻塞。
ZMQ_PUB特性总结
兼容的对等套接字 ZMQ_SUB,ZMQ_XSUB
方向 单向
发送/接收模式 只发送
传入路由策略 N / A
出路由策略 扇出
在静音状态下的动作 丢弃
ZMQ_SUB
用户使用类型为ZMQ_SUB的套接字订阅由发布者分发的数据。 最初,ZMQ_SUB套接字未订阅任何消息,请使用zmq_setsockopt(3)的ZMQ_SUBSCRIBE选项指定要订阅哪些消息。 此套接字类型未实现zmq_send()函数。
ZMQ_SUB特性摘要
兼容的对等套接字 ZMQ_PUB,ZMQ_XPUB
方向 单向
发送/接收模式 只接收
传入路由策略 外播队列
出路由策略 N / A
ZMQ_XPUB
与ZMQ_PUB相同,只不过您可以以传入消息的形式接收来自对等方的订阅。 订阅消息是一个字节1(用于订阅)或字节0(用于取消订阅),随后是订阅主体。 没有sub / unsub前缀的邮件也会收到,但对订阅状态没有影响。
ZMQ_XPUB特性总结
兼容的对等套接字 ZMQ_SUB,ZMQ_XSUB
方向 单向
发送/接收模式 发送消息,接收订阅
传入路由策略 N / A
出路由策略 扇出
在静音状态下的动作 丢弃
ZMQ_XSUB
除了您通过向套接字发送订阅消息进行订阅以外,与ZMQ_SUB相同。 订阅消息是一个字节1(用于订阅)或字节0(用于取消订阅),随后是订阅主体。 没有sub / unsub前缀的消息也可能被发送,但对订阅状态没有影响。
ZMQ_XSUB特性摘要
兼容对等套接字 ZMQ_PUB,ZMQ_XPUB
方向 单向
发送/接收模式 接收消息,发送订阅
传入路由策略 外播队列
出路由策略 N / A
在静音状态下的动作 丢弃
1.1.3.3.3 管道模式
管道模式用于将数据分配给管道中排列的节点。 数据总是沿着流水线流下,并且流水线的每个阶段都连接到至少一个节点。 当一个流水线阶段连接到多个节点时,数据在所有连接的节点之间被轮流处理。管道模式由http://rfc.zeromq.org/spec:30正式定义。
ZMQ_PUSH
管道节点使用类型为ZMQ_PUSH的套接字将消息发送到下游管道节点。 消息对所有连接的下游节点进行循环处理。 此套接字类型未实现zmq_recv()函数。
当ZMQ_PUSH套接字由于达到所有下游节点的高水位标记而进入静音状态,或者根本没有下游节点时,则套接字上的任何zmq_send(3)操作应阻塞,直到静音状态结束或在 至少有一个下游节点可用于发送; 消息不会被丢弃。
ZMQ_PUSH特性总结
兼容的同级插座 ZMQ_PULL
方向 单向
发送/接收模式 只发送
传入路由策略 N / A
传出路由策略 循环赛
静音状态下的动作 阻塞
ZMQ_PULL
管道节点使用类型为ZMQ_PULL的套接字来接收来自上游管道节点的消息。 消息从所有连接的上游节点中公平排队。 此套接字类型未实现zmq_send()函数。
ZMQ_PULL特性摘要
兼容的对等套接字 ZMQ_PUSH
方向 单向
发送/接收模式 只接收
传入路由策略 外播队列
出路由策略 N / A
静音状态下的动作 阻塞
1.1.3.3.4 独家配对模式
独占配对模式用于将对等体连接到另一个对等体。 这种模式用于inproc传输中的线程间通信。排他配对模式由http://rfc.zeromq.org/spec:31正式定义。
ZMQ_PAIR
ZMQ_PAIR类型的套接字只能在任何时候连接到单个对等端。 对通过ZMQ_PAIR套接字发送的消息不执行消息路由或过滤。
当ZMQ_PAIR套接字由于已连接的对等端达到高水位而进入静音状态,或者如果没有对端连接时,则套接字上的任何zmq_send(3)操作都应阻塞,直到对端可用于发送; 消息不会被丢弃。
注:ZMQ_PAIR套接字设计用于跨zmq_inproc(7)传输的线程间通信,而不实现自动重新连接等功能。 ZMQ_PAIR套接字被认为是实验性的,可能有其他缺失或损坏的方面。
ZMQ_PAIR特性总结
兼容的对等套接字 ZMQ_PAIR
方向 双向
发送/接收模式 不受限制
传入路由策略 N / A
出路由策略 N / A
静音状态下的动作 阻塞
1.1.3.3.5 本机模式
本地模式用于与TCP对等进行通信,并允许在任一方向进行异步请求和回复。
ZMQ_STREAM
当使用tcp:// transport时,使用类型为ZMQ_STREAM的套接字??来发送和接收来自非ZMQ对等体的TCP数据。 ZMQ_STREAM套接字可以作为客户端和/或服务器,异步地发送和/或接收TCP数据。
当接收到TCP数据时,一个ZMQ_STREAM套接字在将消息传递给应用程序之前,应该在消息中预先包含一个消息部分,该消息部分包含源消息的身份。收到的消息从所有连接的对等体中公平排队。
发送TCP数据时,ZMQ_STREAM套接字应删除消息的第一部分,并用它来确定消息将被路由到的对等体的身份,而不可路由的消息应引起EHOSTUNREACH或EAGAIN错误。
要打开到服务器的连接,请使用zmq_connect调用,然后使用ZMQ_IDENTITY zmq_getsockopt调用获取套接字标识。
要关闭特定连接,请发送身份证,然后发送零长度消息(请参阅示例部分)。
进行连接时,应用程序将收到一条零长度的消息。同样,当对端断开连接(或连接丢失)时,应用程序将收到一个零长度的消息。
数据帧上的ZMQ_SNDMORE标志被忽略。您必须发送一个身份框架后跟一个数据框。
另外,请注意,省略ZMQ_SNDMORE标志将阻止在同一套接字上发送更多数据(来自任何客户端)。
ZMQ_STREAM特性总结
兼容的同级套接字 没有
方向 双向
发送/接收模式 不受限制
传出路由策略 查看文本
传入路由策略 外播队列
在静音状态 EAGAIN行动
1.1.4 返回值
如果成功,zmq_socket()函数将返回一个不透明的句柄给新创建的套接字。 否则,它将返回NULL并将errno设置为下面定义的值之一。
1.1.5 错误
EINVAL:请求的套接字类型无效。
EFAULT:提供的上下文无效。
EMFILE:已达到开放式ZMQ插座总数的限制。
ETERM:指定的上下文已终止。
2、关闭一个套接字
2.1 zmq_close(3)
2.1.1 名称
zmq_close - 关闭ZMQ套接字
2.1.2 概要
int zmq_close(void * socket);
2.1.3 描述
zmq_close()函数将销毁由套接字参数引用的套接字。 从网络物理接收但尚未通过zmq_recv()应用程序接收到的任何未完成消息都将被丢弃。 丢弃应用程序使用zmq_send()发送但尚未物理传输到网络的消息的行为取决于指定套接字的ZMQ_LINGER套接字选项的值。
注:ZMQ_LINGER的默认设置不会丢弃未发送的消息; 此行为可能会导致应用程序在调用zmq_term()时被阻止。 有关详细信息,请参阅zmq_setsockopt(3)和zmq_term(3)。
2.1.4 返回值
如果成功,zmq_close()函数将返回零。 否则它将返回-1并将errno设置为下面定义的值之一。
2.1.5 错误
ENOTSOCK:提供的套接字无效。
3、操作socket选项
3.1 zmq_getsockopt(3)
3.1.1 名称
zmq_getsockopt - 获取ZMQ套接字选项
3.1.2 概要
int zmq_getsockopt(void * socket,int option_name,void * option_value,size_t * option_len);
3.1.3 描述
zmq_getsockopt()函数将检索由socket参数指向的ZMQ套接字的option_name参数指定的选项的值,并将其存储在option_value参数指向的缓冲区中。 option_len参数是由option_value指向的缓冲区的大小(以字节为单位); 成功完成后,zmq_getsockopt()将修改option_len参数以指示存储在缓冲区中的选项值的实际大小。
可以使用zmq_getsockopt()函数检索以下选项:
ZMQ_AFFINITY:检索I / O线程关联
ZMQ_BACKLOG:检索未完成连接队列的最大长度
ZMQ_CURVE_PUBLICKEY:检索当前的CURVE公钥
ZMQ_CURVE_SECRETKEY:检索当前的CURVE密钥
ZMQ_CURVE_SERVERKEY:检索当前的CURVE服务器密钥
ZMQ_EVENTS:检索套接字事件状态
ZMQ_FD:检索与套接字关联的文件描述符
ZMQ_GSSAPI_PLAINTEXT:检索GSSAPI明文或加密状态
ZMQ_GSSAPI_PRINCIPAL:检索GSSAPI主体的名称
ZMQ_GSSAPI_SERVER:检索当前的GSSAPI服务器角色
ZMQ_GSSAPI_SERVICE_PRINCIPAL:检索GSSAPI服务主体的名称
ZMQ_HANDSHAKE_IVL:检索最大握手时间间隔
ZMQ_IDENTITY:检索套接字标识
ZMQ_IMMEDIATE:检索attach-on-connect值
ZMQ_IPV4ONLY:检索仅限IPv4的套接字覆盖状态
ZMQ_IPV6:检索IPv6套接字状态
ZMQ_LAST_ENDPOINT:检索最后一个端点集
ZMQ_LINGER:检索套接字关闭的持续时间
ZMQ_MAXMSGSIZE:最大可接受的入站消息大小
ZMQ_MECHANISM:检索当前的安全机制
ZMQ_MULTICAST_HOPS:组播数据包的最大网络跳数
ZMQ_PLAIN_PASSWORD:检索当前密码
ZMQ_PLAIN_SERVER:检索当前的PLAIN服务器角色
ZMQ_PLAIN_USERNAME:检索当前PLAIN用户名
ZMQ_RATE:检索多播数据速率
ZMQ_RCVBUF:检索内核接收缓冲区大小
ZMQ_RCVHWM:检索入站消息的高水位标记
ZMQ_RCVMORE:更多消息数据部分要遵循
ZMQ_RCVTIMEO:套接字操作返回EAGAIN之前的最长时间
ZMQ_RECONNECT_IVL:检索重新连接间隔
ZMQ_RECONNECT_IVL_MAX:检索最大重新连接间隔
ZMQ_RECOVERY_IVL:获取组播恢复间隔
ZMQ_SNDBUF:检索内核传输缓冲区大小
ZMQ_SNDHWM:检索出站消息的高水位标记
ZMQ_SNDTIMEO:套接字操作返回EAGAIN之前的最长时间
ZMQ_TCP_KEEPALIVE:重写SO_KEEPALIVE套接字选项
ZMQ_TCP_KEEPALIVE_CNT:覆盖TCP_KEEPCNT套接字选项
ZMQ_TCP_KEEPALIVE_IDLE:覆盖TCP_KEEPCNT(或某些操作系统上的TCP_KEEPALIVE)
ZMQ_TCP_KEEPALIVE_INTVL:覆盖TCP_KEEPINTVL套接字选项
ZMQ_TOS:检索服务类型套接字覆盖状态
ZMQ_TYPE:检索套接字类型
ZMQ_ZAP_DOMAIN:检索RFC 27身份验证域
3.1.4 返回值
如果成功,zmq_getsockopt()函数将返回零。 否则它将返回-1并将errno设置为下面定义的值之一。
3.1.5 错误
EINVAL:请求的选项option_name未知,或者请求的option_len或option_value无效,或者由option_len指定的option_value指向的缓冲区的大小不足以存储选项值。
ETERM:与指定套接字关联的ZMQ上下文已终止。
ENOTSOCK:提供的套接字无效。
EINTR:信号传递中断了操作。
3.2 zmq_setsockopt(3)
3.2.1 名称
zmq_setsockopt - 设置ZMQ套接字选项
3.2.2 概要
int zmq_setsockopt(void * socket,int option_name,const void * option_value,size_t option_len);
注意:除ZMQ_SUBSCRIBE,ZMQ_UNSUBSCRIBE,ZMQ_LINGER,ZMQ_ROUTER_HANDOVER,ZMQ_ROUTER_MANDATORY,ZMQ_PROBE_ROUTER,ZMQ_XPUB_VERBOSE,ZMQ_REQ_CORRELATE和ZMQ_REQ_RELAXED之外的所有选项仅对后续的套接字绑定/连接生效。
具体来说,安全选项会在随后的绑定/连接调用中生效,并且可以随时进行更改以影响后续的绑定和/或连接。
3.2.3 描述
zmq_setsockopt()函数应将option_name参数指定的选项设置为由socket参数指向的ZMQ套接字的option_value参数指向的值。 option_len参数是选项值的大小(以字节为单位)。
可以使用zmq_setsockopt()函数设置以下套接字选项:
ZMQ_AFFINITY:设置I / O线程关联
ZMQ_BACKLOG:设置未完成连接队列的最大长度
ZMQ_CONNECT_RID:分配下一个出站连接ID
ZMQ_CONFLATE:只保留最后一条消息
ZMQ_CURVE_PUBLICKEY:设置CURVE公钥
ZMQ_CURVE_SECRETKEY:设置CURVE密钥
ZMQ_CURVE_SERVER:设置CURVE服务器角色
ZMQ_CURVE_SERVERKEY:设置CURVE服务器密钥
ZMQ_GSSAPI_PLAINTEXT:禁用GSSAPI加密
ZMQ_GSSAPI_PRINCIPAL:设置GSSAPI主体的名称
ZMQ_GSSAPI_SERVER:设置GSSAPI服务器角色
ZMQ_GSSAPI_SERVICE_PRINCIPAL:设置GSSAPI服务主体的名称
ZMQ_HANDSHAKE_IVL:设置最大握手时间间隔
ZMQ_IDENTITY:设置套接字标识
ZMQ_IMMEDIATE:仅对已完成的连接排队消息
ZMQ_IPV6:在套接字上启用IPv6
ZMQ_LINGER:设置套接字关闭的延迟时间
ZMQ_MAXMSGSIZE:最大可接受的入站消息大小
ZMQ_MULTICAST_HOPS:组播数据包的最大网络跳数
ZMQ_PLAIN_PASSWORD:设置PLAIN安全密码
ZMQ_PLAIN_SERVER:设置PLAIN服务器角色
ZMQ_PLAIN_USERNAME:设置PLAIN安全用户名
ZMQ_PROBE_ROUTER:引导到ROUTER套接字的连接
ZMQ_RATE:设置组播数据速率
ZMQ_RCVBUF:设置内核接收缓冲区大小
ZMQ_RCVHWM:设置入站消息的高水位标记
ZMQ_RCVTIMEO:接收操作返回EAGAIN之前的最长时间
ZMQ_RECONNECT_IVL:设置重新连接间隔
ZMQ_RECONNECT_IVL_MAX:设置最大重连间隔
ZMQ_RECOVERY_IVL:设置组播恢复间隔
ZMQ_REQ_CORRELATE:将回复与请求进行匹配
ZMQ_REQ_RELAXED:放松请求和回复之间的严格交替
ZMQ_ROUTER_HANDOVER:在ROUTER套接字上处理重复的客户身份
ZMQ_ROUTER_MANDATORY:只接受ROUTER套接字上可路由的消息
ZMQ_ROUTER_RAW:将ROUTER套接字切换到原始模式
ZMQ_SNDBUF:设置内核发送缓冲区大小
ZMQ_SNDHWM:设置出站消息的高水位标记
ZMQ_SNDTIMEO:发送操作返回EAGAIN之前的最长时间
ZMQ_SUBSCRIBE:建立消息过滤器
ZMQ_TCP_KEEPALIVE:重写SO_KEEPALIVE套接字选项
ZMQ_TCP_KEEPALIVE_CNT:覆盖TCP_KEEPCNT套接字选项
ZMQ_TCP_KEEPALIVE_IDLE:覆盖TCP_KEEPCNT(或某些操作系统上的TCP_KEEPALIVE)
ZMQ_TCP_KEEPALIVE_INTVL:覆盖TCP_KEEPINTVL套接字选项
ZMQ_TOS:在套接字上设置服务类型
ZMQ_UNSUBSCRIBE:删除消息过滤器
ZMQ_XPUB_VERBOSE:提供XPUB套接字上的所有订阅消息
ZMQ_ZAP_DOMAIN:设置RFC 27认证域
ZMQ_TCP_ACCEPT_FILTER:分配过滤器以允许新的TCP连接
ZMQ_IPC_FILTER_GID:分配组ID过滤器以允许新的IPC连接
ZMQ_IPC_FILTER_PID:分配进程ID过滤器以允许新的IPC连接
ZMQ_IPC_FILTER_UID:分配用户ID过滤器以允许新的IPC连接
ZMQ_IPV4ONLY:在套接字上使用仅限IPv4
3.2.4 返回值
如果成功,zmq_setsockopt()函数将返回零。 否则它将返回-1并将errno设置为下面定义的值之一。
3.2.5 错误
EINVAL:请求的选项option_name未知,或请求的option_len或option_value无效。
ETERM:与指定套接字关联的ZMQ上下文已终止。
ENOTSOCK:提供的套接字无效。
EINTR:信号传递中断了操作。
4、建立消息流
4.1 zmq_bind(3)
4.1.1 名称
zmq_bind - 接受套接字上的传入连接
4.1.2 概要
int zmq_bind(void * socket,const char * endpoint);
4.1.3 描述
zmq_bind()函数将套接字绑定到本地端点,然后接受该端点上的传入连接。
端点是一个由transport://后跟一个地址组成的字符串。 transport指定要使用的基础协议。 地址指定要绑定的传输特定地址。
ZMQ提供以下传输:
TCP:使用TCP的单播传输,请参阅zmq_tcp(7)
IPC:本地进程间通信传输,请参见zmq_ipc(7)
INPROC:本地进程内(线程间)通信传输,请参见zmq_inproc(7)
pgm,epgm:使用PGM的可靠组播传输,请参见zmq_pgm(7)
每个ZMQ套接字类型(ZMQ_PAIR除外)都支持一对多和多对一的语义。 精确的语义取决于套接字类型,并在zmq_socket(3)中定义。
ipc和tcp传输接受通配符地址:有关详细信息,请参阅zmq_ipc(7)和zmq_tcp(7)。
注:地址语法对于zmq_bind()和zmq_connect()尤其如此,特别是对于tcp,pgm和epgm传输。
在zmq_bind()之后,套接字进入静音状态,除非或者至少有一个输入或输出连接发生,此时套接字进入就绪状态。 在静音状态下,套接字根据套接字类型阻塞或丢弃消息,如zmq_socket(3)中所定义。 相比之下,在libzmq:zmq_connect [3]之后,套接字进入就绪状态。
4.1.4 返回值
如果成功,则zmq_bind()函数返回零。 否则它返回-1并将errno设置为下面定义的值之一。
4.1.5 错误
EINVAL:提供的端点无效。
EPROTONOSUPPORT:所请求的传输协议不受支持。
ENOCOMPATPROTO:请求的传输协议与套接字类型不兼容。
EADDRINUSE:请求的地址已被使用。
EADDRNOTAVAIL:请求的地址不在本地。
ENODEV:请求的地址指定一个不存在的接口。
ETERM:与指定套接字关联的ZMQ上下文已终止。
ENOTSOCK:提供的套接字无效。
EMTHREAD:没有I / O线程可用于完成任务。
4.2 zmq_connect(3)
4.2.1 名称
zmq_connect - 从套接字创建传出连接
4.2.2 概要
int zmq_connect(void * socket,const char * endpoint);
4.2.3 描述
zmq_connect()函数将套接字连接到端点,然后接受该端点上的传入连接。
端点是一个由transport://后跟一个地址组成的字符串。 transport指定要使用的基础协议。 该地址指定要连接的传输特定地址。
ZMQ提供以下传输:
TCP:使用TCP的单播传输,请参阅zmq_tcp(7)
IPC:本地进程间通信传输,请参见zmq_ipc(7)
INPROC:本地进程内(线程间)通信传输,请参见zmq_inproc(7)
pgm,epgm:使用PGM的可靠组播传输,请参见zmq_pgm(7)
每个ZMQ套接字类型(ZMQ_PAIR除外)都支持一对多和多对一的语义。 精确的语义取决于套接字类型,并在zmq_socket(3)中定义。
注:对于大多数传输和套接字类型,连接不会立即执行,而是由ZMQ根据需要执行。 因此,对zmq_connect()的成功调用并不意味着连接已经或可能实际建立。 因此,对于大多数传输和套接字类型,绑定服务器套接字并将套接字连接到客户端的顺序并不重要。 第一个例外是使用inproc:// transport时:您必须在调用zmq_connect()之前调用zmq_bind()。 第二个例外是ZMQ_PAIR套接字,它不会自动重新连接到端点。
在zmq_connect()之后,对于除ZMQ_ROUTER之外的套接字类型,套接字将进入其正常就绪状态。 相比之下,仅在zmq_bind()之后,套接字将进入静音状态,其中套接字根据套接字类型阻塞或丢弃消息,如zmq_socket(3)中所定义。 ZMQ_ROUTER套接字只有在该对等体的握手完成时才会进入其正常就绪状态,这可能需要任意时间。
4.2.4 返回值
如果成功,zmq_connect()函数返回零。 否则它返回-1并将errno设置为下面定义的值之一。
4.2.5 错误
EINVAL:提供的端点无效。
EPROTONOSUPPORT:所请求的传输协议不受支持。
ENOCOMPATPROTO:请求的传输协议与套接字类型不兼容。
ETERM:与指定套接字关联的ZMQ上下文已终止。
ENOTSOCK:提供的套接字无效。
EMTHREAD:没有I / O线程可用于完成任务。
4.3 zmq_disconnect()
4.3.1 名称
zmq_disconnect - 断开套接字
4.3.2 概要
int zmq_disconnect(void * socket,const char * endpoint);
4.3.3 描述
zmq_disconnect()函数应该将socket参数指定的套接字与endpoint参数指定的端点断开连接。 从网络物理接收但尚未通过zmq_recv()应用程序接收到的任何未完成消息都将被丢弃。 丢弃应用程序使用zmq_send()发送但尚未物理传输到网络的消息的行为取决于指定套接字的ZMQ_LINGER套接字选项的值。
端点参数如zmq_connect(3)中所述。
注:ZMQ_LINGER的默认设置不会丢弃未发送的消息; 此行为可能会导致应用程序在调用zmq_term()时被阻止。 有关详细信息,请参阅zmq_setsockopt(3)和zmq_term(3)。
4.3.4 返回值
如果成功,zmq_disconnect()函数将返回零。 否则它将返回-1并将errno设置为下面定义的值之一。
4.3.5 错误
EINVAL:提供的端点无效。
ETERM:与指定套接字关联的ZMQ上下文已终止。
ENOTSOCK:提供的套接字无效。
ENOENT:提供的端点未连接。
4.4 zmq_unbind()
4.4.1 名称
zmq_unbind - 停止接受套接字上的连接
4.4.2 概要
int zmq_unbind(void * socket,const char * endpoint);
4.4.3 描述
zmq_unbind()函数将从端点参数指定的端点解除由套接字参数指定的套接字。
端点参数如zmq_bind(3)中所述
从套接字解除通配符地址
当在zmq_bind()中使用通配符*端点(在zmq_tcp(7)和zmq_ipc(7)中描述)时,调用方应使用从ZMQ_LAST_ENDPOINT套接字选项中获得的实际终点来从套接字解除绑定此端点。
4.4.4 返回值
如果成功,zmq_unbind()函数将返回零。 否则它将返回-1并将errno设置为下面定义的值之一。
4.4.5 错误
EINVAL:提供的端点无效。
ETERM:与指定套接字关联的ZMQ上下文已终止。
ENOTSOCK:提供的套接字无效。
5、IO模型
5.1 zmq_poll
5.1.1 名称
zmq_poll - 输入/输出复用
5.1.2 概要
int zmq_poll(zmq_pollitem_t * items,int nitems,long timeout);
5.1.3 描述
zmq_poll()函数为应用程序提供了一种机制,用于通过一组套接字以电平触发方式复用输入/输出事件。 由items参数指向的数组的每个成员都是zmq_pollitem_t结构。 nitems参数指定items数组中的项目数。 zmq_pollitem_t结构定义如下:
typedef struct { void //*socket//; int //fd//; short //events//; short //revents//; } zmq_pollitem_t;
对于每个zmq_pollitem_t项目,对于事件中指定的事件,zmq_poll()应检查由套接字引用的ZMQ套接字或由文件描述符fd指定的标准套接字。如果socket和fd都设置在一个zmq_pollitem_t中,则由套接字引用的ZMQ套接字应该优先,并且fd的值应该被忽略。
对于每个zmq_pollitem_t项目,zmq_poll()应首先清除revents成员,然后通过在revents成员中设置与事件条件相对应的位来指示发生的任何请求事件。
如果在任何zmq_pollitem_t项目上没有发生所请求的事件,则zmq_poll()应等待超时毫秒,以便在任何请求的项目上发生事件。如果超时值为0,则应立即返回zmq_poll()。如果超时值为-1,则至少在一个zmq_pollitem_t上发生请求的事件之前,zmq_poll()应无限期地阻塞。
zmq_pollitem_t的事件和revents成员是通过OR组合以下事件标志构造的位掩码:
ZMQ_POLLIN:对于ZMQ套接字,至少可以从套接字接收一条消息而不会阻塞。 对于标准套接字,这相当于poll()系统调用的POLLIN标志,通常意味着至少有一个字节的数据可以在不阻塞的情况下从fd中读取。
ZMQ_POLLOUT:对于ZMQ套接字,至少有一条消息可能会发送到套接字而没有阻塞。 对于标准套接字,这相当于poll()系统调用的POLLOUT标志,通常意味着至少有一个字节的数据可以写入fd而没有阻塞。
ZMQ_POLLERR:对于标准套接字,此标志通过zmq_poll()传递给底层的poll()系统调用,通常意味着由fd指定的套接字上存在某种错误条件。 对于ZMQ套接字,如果在事件中设置此标志,则该标志不起作用,并且绝不会由zmq_poll()返回。
注:zmq_poll()函数可以使用除poll()以外的操作系统接口来实现或模拟,因此可能会受到本文档中未定义的那些接口的限制。
5.1.4 返回值
成功完成后,zmq_poll()函数应返回zmq_pollitem_t结构的数量,事件以revents标记,如果没有事件发出信号,则返回0。 失败时,zmq_poll()应返回-1并将errno设置为下面定义的值之一。
5.1.5 错误
ETERM:items数组中至少有一个成员是指其关联的ZMQ上下文已终止的套接字。
EFAULT:提供的项目无效(NULL)。
EINTR:在任何事件发生之前,操作都会通过传递信号而中断。
6、监视套接字事件
6.1 zmq_socket_monitor(3)
6.1.1 名称
zmq_socket_monitor - 监视套接字事件
6.1.2 概要
int zmq_socket_monitor(void * socket,char * endpoint,int events);
6.1.3 描述
zmq_socket_monitor()方法允许应用程序线程跟踪ZeroMQ套接字上的套接字事件(如连接)。 每次调用此方法都会创建一个ZMQ_PAIR套接字并将其绑定到指定的inproc://端点。 要收集套接字事件,您必须创建您自己的ZMQ_PAIR套接字,并将其连接到端点。
events参数是您希望监视的套接字事件的掩码,请参阅下面的支持的事件。 要监视所有事件,请使用事件值ZMQ_EVENT_ALL。
每个事件都以两个帧发送。 第一帧包含一个事件编号(16位)和一个根据事件编号提供附加数据的事件值(32位)。 第二帧包含一个字符串,用于指定受影响的TCP或IPC端点。
注:_zmq_socket_monitor()_方法仅支持面向连接运输,即TCP,IPC和TIPC。
6.1.4 支持的事件
ZMQ_EVENT_CONNECTED:套接字已成功连接到远程对等体。事件值是底层网络套接字的文件描述符(FD)。警告:在您的代码收到此事件时,不能保证FD仍然有效。
ZMQ_EVENT_CONNECT_DELAYED:套接字上的连接请求正在等待处理。事件值是未指定的。
ZMQ_EVENT_CONNECT_RETRIED:连接请求失败,现在正在重试。事件值是以毫秒为单位的重新连接间隔。请注意,每次重试时重新计算重新连接间隔。
ZMQ_EVENT_LISTENING:套接字已成功绑定到网络接口。事件值是底层网络套接字的FD。警告:在您的代码收到此事件时,不能保证FD仍然有效。
ZMQ_EVENT_BIND_FAILED:套接字无法绑定到给定的接口。事件值是由系统绑定调用生成的errno。
ZMQ_EVENT_ACCEPTED:套接字已经接受来自远程对等体的连接。事件值是底层网络套接字的FD。警告:在您的代码收到此事件时,不能保证FD仍然有效。
ZMQ_EVENT_ACCEPT_FAILED:套接字已拒绝来自远程对等方的连接。事件值是accept调用生成的errno。
ZMQ_EVENT_CLOSED:该插座已关闭。事件值是(现在已关闭)网络套接字的FD。
ZMQ_EVENT_CLOSE_FAILED:套接字关闭失败。事件值是系统调用返回的errno。请注意,此事件仅在IPC传输中发生。
ZMQ_EVENT_DISCONNECTED:插座意外断开。事件值是底层网络套接字的FD。警告:此插座将被关闭。
ZMQ_EVENT_MONITOR_STOPPED:此套接字上的监视已结束。
6.1.4 返回值
如果成功,zmq_socket_monitor()函数返回0或更大的值。 否则它返回-1并将errno设置为下面定义的值之一。
6.1.5 错误
ETERM:与指定套接字关联的ZMQ上下文已终止。
EPROTONOSUPPORT:所请求的传输协议不受支持。 Monitor套接字需要使用inproc://传输。
EINVAL:提供的端点无效