ZeroMQ的学习

使用zmqpp-4.2.0,但是用函数zmq_version发现版本是 4.3.4

ZeroMQ在CMake的设置

1
2
3
4
5
6
7
8
9
10
11
12
cmake_minimum_required(VERSION 3.5)

project(untitled LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include_directories(zmqpp-4.2.0/src/zmqpp)
LINK_DIRECTORIES(zmqpp-4.2.0/lib/)

add_executable(untitled main.cpp)
target_link_libraries(untitled zmq)

查看版本

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <zmq.h>
// 显示当前的zeromq版本
int main()
{
int major, minor, patch;
zmq_version(&major, &minor, &patch);
printf("Current ZeroMQ version is %d.%d.%d\n", major, minor, patch);
}

发布和订阅

pub端:

  • 创建context
  • 创建socket,设置ZMQ_PUB模式
  • bind端口
  • 循环发布消息send

sub端:

  • 创建context
  • 创建socket,设置ZMQ_SUB模式
  • connect到pub端
  • setsockopt设置ZMQ_SUBSCRIBE订阅的消息
  • 循环接收recv

注意事项:

  1. 我们在pub中bind,在sub中connect,在zmq的使用中无论是在pub还是sub中都可以bind,但是一般我们在pub中bind,在sub中connect。反之sub端可能收不到消息
  2. zmq_setsockopt – 设置zmq的socket属性,sub端必须使用此方法,否则是收不到消息的。
  3. pub端不能使用recv函数,sub端不能使用send函数
  4. 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

参考:
zmq pub/sub使用详解