使用zmqpp-4.2.0
,但是用函数zmq_version
发现版本是 4.3.4
ZeroMQ在CMake的设置
1 | cmake_minimum_required(VERSION 3.5) |
查看版本
1 |
|
发布和订阅
pub端:
- 创建context
- 创建socket,设置
ZMQ_PUB
模式 - bind端口
- 循环发布消息send
sub端:
- 创建context
- 创建socket,设置
ZMQ_SUB
模式 - connect到pub端
setsockopt
设置ZMQ_SUBSCRIBE
订阅的消息- 循环接收recv
注意事项:
- 我们在pub中
bind
,在sub中connect
,在zmq的使用中无论是在pub还是sub中都可以bind,但是一般我们在pub中bind,在sub中connect
。反之sub端可能收不到消息 zmq_setsockopt
– 设置zmq的socket属性,sub端必须使用此方法,否则是收不到消息的。- pub端不能使用recv函数,sub端不能使用send函数
- pub端socket的zmq_send()函数永远不会阻塞
zmq_msg_init_size
使用一个指定的空间大小初始化ZMQ消息对象。原型int zmq_msg_init_size (zmq_msg_t *msg, size_t size);
分配任何被请求的资源来存储一个size大小字节的消息,并且初始化msg参数指定的消息,用来表示新分配到的消息。
在函数执行的时候,会选择是否把消息存储在栈里面(小消息),还是堆里面(大消息)。考虑到性能原因,函数不会清除消息数据。
永远不要直接对zmq_msg_t
对象进行直接操作,而是要使用zmq_msg
函数族进行操作。
zmq_msg_init()
, zmq_msg_init_data()
和zmq_msg_init_size()
这三个函数是互斥的。永远不要把一个zmq_msg_t
对象初始化两次。
执行成功时返回0。否则返回 -1,并且设置errno的值为下列定义的值。
zmq_msg_data
原型void *zmq_msg_data (zmq_msg_t *msg);
返回msg参数指定的消息内容的指针。
函数执行成功返回0,否则返回 -1