这个模型里,管道是单向的,从 PUSH 端单向的向 PULL 端单向的推送数据流。因为这个模型几乎不怎么使用了,我就没有特意去了解,后面等有时间学习了这方面的知识后在做更新。
通过 zmq_setsockopt 和 zmq_getsockopt 函数来设置/读取指定选项。
ZMQ_TYPE 属性会返回 socket 参数指定的 socket 的类型。socket 的类型是在创建的时候指定的,并且在之后不能修改。
描述 | 类型 |
---|
Option value type: | int |
Option value uint: | N/A |
Default value: | N/A |
Applicable socket types: | all |
注意:ZMQ 不保证 Socket 一定能接受 ZMQ_SNDHWM 这么多的消息,甚至可能会低60%-70%,这取决于socket上的信息流。
描述 | 类型 |
---|
Option value type: | int |
Option value uint: | message |
Default value: | 1000 |
Applicable socket types: | all |
描述 | 类型 |
---|
Option value type: | int |
Option value uint: | message |
Default value: | 1000 |
Applicable socket types: | all |
-
ZMQ_SUBSCRIBE 选项会在 ZMQ_SUB 的 Socket 上建立一个消息过滤器。初始的 ZMQ_SUB 的 Socket 会过滤掉所有的消息,因此必须设置这个选项,否则将收不到任何消息。
-
如果设置一个 0 长度(option_value)的空值(option_value),ZMQ_SUB 的 Socket 会接受所有的消息。设置一个非空值将接受指定的消息。可以在同一个 ZMQ_SUB 的 Socket 上设置多个过滤器,它将会接受至少一个匹配的消息。
描述 | 类型 |
---|
Option value type: | binary data |
Option value uint: | N/A |
Default value: | N/A |
Applicable socket types: | ZMQ_SUB |
- 此选项用来删除 ZMQ_SUB 的 Socket 上通过 ZMQ_SUBSCRIBE 设置过的消息过滤器。如果 Socket 有多个实例有相同的过滤器,只删除其中一个。
描述 | 类型 |
---|
Option value type: | binary data |
Option value uint: | N/A |
Default value: | N/A |
Applicable socket types: | ZMQ_SUB |
-
此选项用来设置 Socket 的身份标识,只能用于请求/答应模式。ROUTER 的 Socket 可以根据这个身份标识来路由信息。
-
身份标识的长度规定在 1-255 bytes. 由二进制零开头的标识符为 ZMQ 保留使用。
-
如果两个身份标识相同的Socket连接到同一个对端(ROUTER),结果行为是未定义的。
描述 | 类型 |
---|
Option value type: | binary data |
Option value uint: | N/A |
Default value: | NULL |
Applicable socket types: | ZMQ_REQ, ZMQ_REP, ZMQ_ROUTER, ZMQ_DEALER |
-
设置 Socket 的 receive 操作的超时。
-
如果为0,则 zmq_recv 会立即返回,如果没有接收到消息,会返回一个 EAGAIN 错误;
-
如果为-1,Socket 会阻塞到有可用消息为止;
-
如果为其他值,Socket 要么阻塞达到指定的时间还没接收到可用的消息,返回一个 EAGAIN 错误,要么在指定时间前接收到可用消息。
描述 | 类型 |
---|
Option value type: | int |
Option value uint: | milliseconds |
Default value: | -1(infinite) |
Applicable socket types: | all |
-
设置 Socket 的 Send 操作的超时。
-
如果为 0,则 zmq_send 会立即返回,如果消息没有发送成功,会返回一个EAGAIN错误;
-
如果为 -1,Socket 会一直阻塞到消息消息发送完毕;
-
如果为其他值,Socket 要么阻塞达到指定的时间还没发送完成,返回一个EAGAIN错误,要么在指定时间前发送完消息。
描述 | 类型 |
---|
Option value type: | int |
Option value uint: | milliseconds |
Default value: | -1(infinite) |
Applicable socket types: | all |
ZMQ_LINGER 属性会返回 socket 参数指定的 socket 的存留时间。存留时间决定了当 socket 被 zmq_close() 关闭后,将要被发送而没有发送到另一端的消息在内存中能够停留的时间。这会进一步影响与此 socket 相关联的 context 使用 zmq_term() 方式进行终结的结果。
下面指出了几种不同的行为:
-
默认值是 -1,指定一个无限的存留时间。在此期间的消息不会由于zmq_close()函数的使用而被终结。试图使用zmq_term()函数来终结于此socket相关联的context的行为会被阻塞,直到消息被发送到对端为止。
-
属性值是0指明了没有存留时间。当使用zmq_close()关闭socket的时候,消息队列中的消息会被立刻丢弃。
-
属性值是正数表示会绑定一个毫秒级的正值。在调用zmq_close()函数后,发送消息队列中的消息不会被丢弃;试图使用zmq_term()函数对与socket相关联的context进行终结的操作都会被阻塞,直到所有的消息都被发送到对端,或者停留时间结束了,停留时间结束的时候,消息队列中的所有消息都会被丢弃。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | 毫秒(ms) |
默认值 | -1 |
可以应用的 socket 类型 | 所有 socket 可用 |
ZMQ_SNDBUF 属性会返回 socket 参数指定的 socket 的底层内核的传输缓存的大小。如果这个值是0,则说明OS的默认值是生效的。要获取更多细节请参考您的操作系统文档中关于SO_SNDBUF的套接字属性。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | byte |
默认值 | 0 |
可以应用的 socket 类型 | 所有 socket 可用 |
ZMQ_RCVBUF 属性会返回 socket 参数指定的 socket 的底层内核的接收缓存大小。如果返回值是0,说明OS的默认值在起作用。要获取更多细节请参考您的操作系统文档中关于SO_RCVBUF的套接字属性。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | byte |
默认值 | 0 |
可以应用的 socket 类型 | 所有 socket 可用 |
返回连接接触的状态值。如果设置为1,回延迟连接上的接触管道,直到底层的连接建立完成了。如果没有其它的连接,这回导致这个socket阻塞;但是会防止在等待连接的期间出现消息队列被填满。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | 布尔 |
默认值 | 0(否) |
可以应用的 socket 类型 | 所有socket可用,当使用TCP/IPC传输方式的时候首先考虑 |
如果刚刚接到的一帧消息后面还有更多的消息帧,那么 ZMQ_RCVMORE 属性会返回True(1)。如果后面没有剩余的帧了,那么会返回False(0)。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | 布尔 |
默认值 | N/A |
可以应用的 socket 类型 | 所有socket可用 |
ZMQ_AFFINITY 属性会返回socket参数指定的socket上最新创建的链接的I/O关联。关联决定了这个socket相联系的context的线程池中的哪一个线程来接管新建立的连接。属性值是0表示没有关联,意味着任务会在线程池中的所有线程中公平的分配。对于非0值,最低位的一位(二进制位)对应线程1,次低位对应线程2,等等…例如,值是3表示接下来建立的连接会唯一的被线程1和2接管。
描述 | 类型 |
---|
属性值类型 | uint_64 |
属性值单位 | N/A |
默认值 | 0 |
可以应用的 socket 类型 | N/A |
返回多路广播数据速率。ZMQ_RATE 选项返回使用 socket 指定的 socket 进行多路广播的时候发送或者接收数据的最大值。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | kb/s |
默认值 | 100 |
可以应用的 socket 类型 | 当使用多路传输方式时,所有socket可用 |
获取多播时的恢复间隔。ZMQ_RECOVERY_IVL 属性会返回 socket 参数指定的 socket 多路广播传输模式时的恢复间隔。恢复时间决定了当一个广播组中不可恢复的消息在被丢弃前,一个接收者在一个广播组里面缺席的最长毫秒时间。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | 毫秒(ms) |
默认值 | 10000 |
可以应用的 socket 类型 | 当使用多路传输方式时,所有socket可用 |
返回重连时间间隔。ZMQ_RECONNECT_IVL 属性会返回 scoket 指定的 socket 的初始化重连间隔。重连间隔是当使用面向连接的传输方式的时候,在连接断开的时候,ZMQ尝试重新进行连接的等待周期。属性值是 -1 表示不需要重连。
重连周期可能会被 ZMQ 随机选取,以避免当一个 socket 连接了多个对端的时候网络拓扑中出现重连风暴。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | 毫秒(ms) |
默认值 | 100 |
可以应用的 socket 类型 | 面向连接的传输方式时,所有socket可用 |
返回重连间隔的最大值。ZMQ_RECONNECT_IVL_MAX 属性返回 socket 参数指定的 socket 重连间隔的最大值。这个属性是在你两次尝试重连之间等待时间的最大值。在每次重连的时候,重连间隔都会是前一次的两倍,直到到达 ZMQ_RECONNECT_IVL_MAX 。这个属性允许指数补偿策略。默认值是非指数执行方式,并且重连间隔只基于 ZMQ_RECONNECT_IVL 。
小于ZMQ_RECONNECT_IVL的值都会被忽略。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | 毫秒(ms) |
默认值 | 0(只使用ZMQ_RECONNECT_IVL) |
可以应用的 socket 类型 | 面向连接的传输方式时,所有socket可用 |
返回未解决的链接队列的最大值。ZMQ_BACKLOG 属性返回 socket 参数指定的socket 上未解决的链接队列长度的最大值;这只对面向连接的传输方式有效。要获得更多细节,请参考您的操作系统文档中关于listen函数的部分。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | 链接 |
默认值 | 100 |
可以应用的 socket 类型 | 面向连接的传输方式时,所有socket可用 |
流入的消息大小的最大值。这个属性会返回流入的消息的限制。如果一个对端发送了一个比 ZMQ_MAXMSGSIZE 长的消息,这个链接就会断开。值是 -1表示没有限制。
描述 | 类型 |
---|
属性值类型 | int64_t |
属性值单位 | byte |
默认值 | -1 |
可以应用的 socket 类型 | 所有socket可用 |
这个属性用于返回向外发送的广播包的存活时间。默认值是 -1,表示这个广播包不能够离开本地网络。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | 网络跳数 |
默认值 | -1 |
可以应用的 socket 类型 | 当使用广播传输方式时,所有socket可用 |
返回socket的IPv6状态。返回这个socket的IPv6属性。如果这个值是1,表示IPv6在这个socket上允许使用;如果是0,表示这个socket只能使用IPv4。如果IPv6是可用的,这个socket可以连接/接受IPv4/IPv6主机的连接。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | bool |
默认值 | 0 (否) |
可以应用的 socket 类型 | 当使用TCP连接的时候,所有socket可用 |
返回只使用IPv4的socket代理状态。返回这个socket只使用IPv4的属性。这个属性请慎用。
请使用ZMQ_IPV6属性。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | bool |
默认值 | 1 (是) |
可以应用的 socket 类型 | 当使用TCP连接的时候,所有socket可用 |
返回与这个socket联系的文件描述符。ZMQ_FD 属性会返回与这个 socket 相联系的文件描述符。被返回的文件描述符可以被用来把这个socket集成到一个已经存在的事件循环里面; ZMQ 动态链接库会通过标记文件描述符已准备好被读取了,当这个 socket 上有任何事件处于一种边沿触发方式的时候。
能否从返回的文件描述符中读取数据,不须要指明是否能够从底层的socket中读取或者写入;应用程序必须通过ZMQ_EVENTS属性进行后续的检索,来检查真是的事件状态。
返回的文件描述符也必须使用 zmq_send 和 zmq_recv 函数在内部使用。因为文件描述符是边缘触发中断的,应用程序在每次调用 zmq_send 或者 zmq_recv 函数进行读取之后都需要更新 ZMQ_EVENTS 的状态。说的更明确:在调用 zmq_send 函数之后,这个 socket 可能变得可读了(反之亦然),但是并没有在这个问价描述符上触发一次读事件。
返回的文件描述符被设计用于使用poll或者类似的系统调用。应用程序千万不要试图直接对其进行数据读写,也不要试图关闭它。
描述 | 类型 |
---|
属性值类型 | 在POSIX系统中为int,在Windows系统中为SOCKET |
属性值单位 | N/A |
默认值 | N/A |
可以应用的 socket 类型 | 所有socket可用 |
返回socket的事件状态。
ZMQ_EVENTS 属性会返回 socket 参数指定的 socket 的事件状态。返回值是一个由下列事件标志进行或操作的组合:
- ZMQ_POLLIN:指出至少有一个消息可以在此 socket 上就行非阻塞接收。
- ZMQ_POLLOUT:指出至少有一个消息可以在此 socket 上进行非阻塞发送。
被 ZMQ_FD 属性返回的文件描述组合,已经可以被读取数据但是 ZMQ_EVENTS 属性检查后却没有实际的事件返回的情况也是正常的;应用程序只需要简单的忽略这种情况并且重新启动它们的操作/事件循环即可。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | N/A |
默认值 | N/A |
可以应用的 socket 类型 | 所有socket可用 |
返回最后一个终结点。
ZMQ_LAST_ENDPOINT 属性会返回最后绑定的 TCP/IPC 传输协议的终结点。返回值会是一个 ZMQ DSN 格式的字符串。注意,如果 TCP 主机是 INADDR_ANY,或者是由*指定的,那么返回值会是0.0.0.0(IPv4)。
描述 | 类型 |
---|
属性值类型 | 以NULL结尾的字符串 |
属性值单位 | N/A |
默认值 | NULL |
可以应用的 socket 类型 | 当使用TCP/IPC协议的时候,所有socket可用 |
返回最后一个终结点
ZMQ_LAST_ENDPOINT 属性会返回最后绑定的 TCP/IPC 传输协议的终结点。返回值会是一个 ZMQ DSN 格式的字符串。注意,如果 TCP 主机是 INADDR_ANY,或者是由*指定的,那么返回值会是 0.0.0.0(IPv4)。
描述 | 类型 |
---|
属性值类型 | 以NULL结尾的字符串 |
属性值单位 | N/A |
默认值 | NULL |
可以应用的 socket 类型 | 当使用TCP/IPC协议的时候,所有socket可用 |
重写SO_KEEPALIVE socket属性。
重写SO_KEEPALIVE socket 属性(被OS支持的)。默认值是 -1,表示跳过任何重写操作,并且使用系统的默认值。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | -1, 0 , 1 |
默认值 | -1(使用OS的默认值) |
可以应用的 socket 类型 | 当使用TCP协议的时候,所有socket可用 |
重写 TCP_KEEPCNT(或者一些系统上的TCP_KEEPALIVE)。
重写TCP_KEEPCNT(或者一些OS上的TCP_KEEPALIVE)属性(被OS支持的)。默认值是 -1,表示跳过任何重写操作并使用OS的默认值。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | -1, >0 |
默认值 | -1(使用OS的默认值) |
可以应用的 socket 类型 | 当使用TCP协议的时候,所有socket可用 |
重写TCP_KEEPCNT socket属性。
重写TCP_KEEPCNT socket属性(被操作系统支持的)。默认值是 -1,表示跳过所有的重写操作并且使用系统的默认值。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | -1, >0 |
默认值 | -1(使用OS的默认值) |
可以应用的 socket 类型 | 当使用TCP协议的时候,所有socket可用 |
重写TCP_KEEPINTVL socket属性。
重写 TCP_KEEPINTVL socket 属性(被操作系统支持的)。默认值是 -1,表示跳过所有的重写操作,并且使用操作系统的默认值。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | -1, >0 |
默认值 | -1(使用OS的默认值) |
可以应用的 socket 类型 | 当使用TCP协议的时候,所有socket可用 |
返回当前的安全机制。
ZMQ_MECHANISM属性返回这个socket当前的安全机制。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | ZMQ_NULL, ZMQ_PLAIN, 或者ZMQ_CURVE |
默认值 | ZMQ_NULL |
可以应用的 socket 类型 | 当使用TCP/IPC协议的时候,所有socket可用 |
返回当前PLAIN服务的角色。
返回 ZMQ_PLAIN_SERVER 属性,如果有的话,socket 预设的。
描述 | 类型 |
---|
属性值类型 | int |
属性值单位 | 0,1 |
默认值 | int |
可以应用的 socket 类型 | 当使用TCP/IPC协议的时候,所有socket可用 |
返回当前PLAIN的用户名。
ZMQ_PLAIN_USERNAME属性会返回给PLAIN安全机制最后设置的用户名。返回值必须是一个以NULL结尾的字符串或者空字符串。返回的空间大小应该包括这个结尾的字符字节。
描述 | 类型 |
---|
属性值类型 | 以NULL结尾的字符串 |
属性值单位 | N/A |
默认值 | 空字符串 |
可以应用的 socket 类型 | 当使用TCP/IPC协议的时候,所有socket可用 |
返回当前的密码。
ZMQ_PLAIN_PASSWORD属性返回给PLAIN安全机制最后设置的密码。返回值必须是一个以NULL结尾的字符串或者空字符串。返回的空间大小应该包括这个空字节。
描述 | 类型 |
---|
属性值类型 | 以NULL结尾的字符串 |
属性值单位 | N/A |
默认值 | 空字符串 |
可以应用的 socket 类型 | 当使用TCP/IPC协议的时候,所有socket可用 |
返回当前CURVE的公钥。
返回此 socket 上当前长期公钥。你可以提供一个32B的存储空间,来接收二进制公钥值,或者41B的存储空间,来接收Z85格式的值。注意:为了能够取得一个可打印的公钥,存储空间必须是41B的大小,40B用来存放公钥值,1B存放空字符。
描述 | 类型 |
---|
属性值类型 | 二进制数据或Z85字符串 |
属性值单位 | 32或41 |
默认值 | 空字符串 |
可以应用的 socket 类型 | 当使用TCP协议的时候,所有socket可用 |
返回当前的CURVE socket 秘钥。
返回此 socket 的当前长期秘钥。以可以提供一个32B的存储空间,来接收二进制秘钥,或者41B的存储空间,来接收Z85格式的可打印秘钥。
描述 | 类型 |
---|
属性值类型 | 二进制数据或Z85字符串 |
属性值单位 | 32或41 |
默认值 | 空字符串 |
可以应用的 socket 类型 | 当使用TCP协议的时候,所有socket可用 |
返回当前的CURVE服务器码。
返回客户端 socket 的当前的服务器码。你可以提供32B的存储空间,来接收二进制的值,或者41B的存储空间,来接收Z85格式的可打印值。
描述 | 类型 |
---|
属性值类型 | 二进制数据或Z85字符串 |
属性值单位 | 32或41 |
默认值 | 空字符串 |
可以应用的 socket 类型 | 当使用TCP协议的时候,所有socket可用 |
返回RFC 27的认证域。
ZMQ_ZAP_DOMAIN 属性会返回给此 socket 最后设置的 ZAP 域。返回值可能是一个以 NULL 结尾的字符串,或者空字符串。返回的字符串长度应该包括最后的结束字符。
描述 | 类型 |
---|
属性值类型 | 字符串 |
属性值单位 | N/A |
默认值 | 无设置 |
可以应用的 socket 类型 | 当使用TCP协议的时候,所有socket可用 |
https://blog.csdn.net/mysunshinexia01/article/details/80871696
https://www.cnblogs.com/dvwei/p/3608119.html
http://api.zeromq.org/
https://www.cnblogs.com/mysky007/p/12288729.html
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html
本文地址 :http://www.cnblogs.com/fengbohello/p/4398953.html
翻译:郝峰波
mail : fengbohello@qq.com
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:z...
1.zmq传输离散消息,传统套接字传输字节流或离散数据报
2.zmq是异步的,连接的建立拆除等对用户透明并由zmq本身管理。
3.传统套接字不支持多对多,zmq支持多对多。
绑定与链接
1.本身谁bind 谁connect都没有关系,一般服务器使用bind,客户端使用connect
2.bind不会提前创建队列,因为不知道有多少对端
3.connect可以立即创建队列,因为至少要连接一个对端
4.一般选择架构中稳定的点作为bind(服务端)
High-Water-Mark
ZMQ专题学习之一:初识ZeroMQ
ZeroMQ号称是“史上最快的消息队列”,基于c语言开发的。引用官方说明定义:“ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。
ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”。是极具前景的并且是人们更加需要的“传统”BSD套接字之上的一层封装。ZMQ让编写高性能网络应用程序极为简单和有趣。相比较它跟RabbitMQ、ActiveMQ之类的M
void *zmq_socket(void *context, int type)
zmq_socket(): 在一个特定的context中创建一个0MQ socket,返回一个不透明的句柄到新创建的socket中。
type: 指定socket类型。
新创建的socket初试时时未绑定的,不和任何
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html
ZeroMQ 官方地址:http://api.zeromq.org/4-0:zmq-socket
翻译:风波
mail : fengbohello@qq.com
—————————————————————————————————————
zmq_sock...
这里使用ZMQ_PAIR的连接模式,不是ZMQ_REP和ZMQ_REQ。如果使用ZMQ_REP和ZMQ_REQ模式,一方接收到消息之后需要回复,才能再接收消息。这里我们使用ZMQ_PAIR的模式,服务器端可以不断接收client发来的消息,放到一个消息队列中,使用另一个线程处理消息队列中的数据。这样做的好处是,如果发送者的发送速度过快,我们就可以把消息缓存到这个队列中。同时,我们其它组件也可以将消息直接放到这个队列中,以让服务器来处理。
下面代码的功能:client给server发送多个消息,server将
Qt 是一个跨平台的 C++ 应用程序开发框架,而 ZeroMQ(简称 ZMQ)是一个高性能、异步的消息传递库。在 Qt 中使用 ZMQ 实现消息队列需要进行以下几个步骤:
1. 首先,下载并安装 ZMQ 库。你可以从 ZeroMQ 的官方网站(https://zeromq.org/)下载适合你的操作系统的库文件,并按照安装指南进行安装。
2. 在 Qt 项目中添加 ZMQ 的头文件路径和库文件路径。在项目的 .pro 文件中添加以下内容:
```pro
INCLUDEPATH += /path/to/zmq/include
LIBS += -L/path/to/zmq/lib -lzmq
将上述路径替换为你实际安装 ZMQ 库的路径。
3. 在 Qt 代码中引入 ZMQ 相关的头文件:
```cpp
#include <zmq.hpp>
4. 创建一个 ZMQ 的上下文(context)对象和一个 socket 对象:
```cpp
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_PUB); // 这里以发布者(publisher)为例,如果是订阅者(subscriber)则使用 ZMQ_SUB
5. 配置 socket 的连接参数(可选):
```cpp
socket.bind("tcp://localhost:5555"); // 绑定到本地地址和端口
6. 发送消息到消息队列:
```cpp
std::string message = "Hello, ZMQ!";
zmq::message_t zmqMessage(message.size());
memcpy(zmqMessage.data(), message.data(), message.size());
socket.send(zmqMessage);
可以根据具体需求自定义消息的格式和内容。
7. 关闭 socket 和 context:
```cpp
socket.close();
context.close();
这样,你就可以在 Qt 中使用 ZMQ 实现消息队列的功能了。当然,这只是一个简单的示例,实际应用可能需要更复杂的逻辑来处理接收和处理消息等操作。