zmqPUBSUB模式传输(C)
运行系统:centos7
安装依赖:yum -y install wget wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm rpm -ivh epel-release-7-14.noarch.rpm # 查看所有可安装的zmq依赖 yum search zmq # 安装 yum -y install czmq-devel
API: http://api.zeromq.org/
server端:#include #include #include #include #include #include #include #include using namespace std; int s_send(void *socket, char const *string) { // 初始化一个zmq_msg_t对象, 分配的大小为string的大小 zmq_msg_t msg; zmq_msg_init_size(&msg, strlen(string)); memcpy(zmq_msg_data(&msg), string, strlen(string)); // 发送数据 zmq_msg_send(&msg, socket, 0); // 关闭zmq_msg_t zmq_msg_close(&msg); } int main() { // 初始化上下文 void *context = zmq_ctx_new(); // 创建、绑定套接字 void *publisher = zmq_socket(context, ZMQ_PUB); // 绑定到tcp节点 int rc = zmq_bind(publisher, "tcp://*:5555"); assert(rc == 0); std::cout << "start send data" << std::endl; char const *string = "hello world"; while(1) { s_send(publisher, string); sleep(1); } zmq_close(publisher); zmq_ctx_destroy(context); }
client端#include #include #include #include #include #include #include using namespace std; char *s_recv(void *socket) { // 创建zmq_msg_t对象接收数据 zmq_msg_t msg; zmq_msg_init(&msg); int size = zmq_msg_recv(&msg, socket, 0); if (size == -1) { return NULL; } // 将zmq_msg_t对象中的数据保存到字符串中 char *string = (char*)malloc(size + 1); memcpy(string, zmq_msg_data(&msg), size); zmq_msg_close(&msg); string[size] = 0; return string; } int main() { // 初始化上下文 void *context = zmq_ctx_new(); // 创建套接字、连接发布者 void *subscriber = zmq_socket(context, ZMQ_SUB); int rc = zmq_connect(subscriber, "tcp://localhost:5555"); assert(rc == 0); // 设置过滤器,指定需要接收什么类型的消息 char const *filter = "MDIndexSnapshot"; rc = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, filter, strlen(filter)); assert(rc == 0); std::cout << "start recv data" << std::endl; while(1) { char *string = s_recv(subscriber); std::cout << string << std::endl; free(string); } }
运行命令:# 服务端 g++ server.cpp -o server -lzmq ./server # 客户端 g++ client.cpp -o client -lzmq ./client