消息库-ZeroMQ介绍

消息库-ZeroMQ介绍ZeroMQ 也称为 MQ zmq 或 libzmq 是一个高性能的异步消息传递库 用于构建分布式或并发应用程序

大家好,欢迎来到IT知识分享网。

1.简介

ZeroMQ (也称为 ØMQ, zmq 或 libzmq) 是一个高性能的异步消息传递库,用于构建分布式或并发应用程序。它提供了一个消息队列的抽象,允许不同的计算机和进程之间进行消息传递,而无需关心底层网络细节。ZeroMQ 不是一个传统意义上的消息队列服务器,而是一个嵌入到应用程序中的库,它提供了多种消息传递模式,如请求-应答、发布-订阅、推-拉等。

ZeroMQ不是单独的服务或者程序,仅仅是一套组件,其封装了网络通信、消息队列、线程调度等功能,向上层提供简洁的API,应用程序通过加载库文件,调用API函数来实现高性能网络通信。

ZeroMQ(0MQ)提供了多种不同的消息传递模型,每种模型都适用于不同的通信场景。以下是ZeroMQ提供的几种主要模型简介:

  • 请求-应答(REQ/REP)
    模式:客户端发送请求,服务器接收请求并发送应答;客户端可以是1~N个。该模型主要用于远程调用及任务分配。
    应用场景:客户端-服务器通信,如RPC(远程过程调用)。

  • 发布-订阅(PUB/SUB)
    模式:发布者发布消息到主题,订阅者接收消息;发布端单向分发数据,且不关心是否把全部信息发送给订阅端。如果发布端开始发布信息时,订阅端尚未连接上来,则这些信息会被直接丢弃;订阅端只负责接收,而不能反馈。
    应用场景:消息队列、消息广播。

  • 推送-拉取(PUSH/PULL)
    模式:推送者发送数据,拉取者接收数据;与发布订阅模型相比,推拉模型在没有消费者的情况下,发布的消息不会被消耗掉;该模型主要用于多任务并行处理。
    应用场景:数据管道、批处理。

2.环境搭建

下载地址:https://github.com/zeromq/libzmq

在这里插入图片描述
解压后,使用cmake进行编译。
接下来就是Configure –> Generate –> Open Project一连三键。
在这里插入图片描述
拷贝源码的include目录和生成的lib库到我们的demo程序中,配置好visual studio的环境。



3.常用接口介绍

  • zmq_ctx_new – 创建新的ZeroMQ上下文
    函数原型:int zmq_ctx_new (void)
    功能:创建一个新的ZeroMQ上下文,用于管理套接字和事件循环。
    返回值:如果成功,返回上下文句柄;如果失败,返回-1。


  • zmq_ctx_term – 销毁ZeroMQ上下文
    函数原型:int zmq_ctx_term (void *context)
    功能:销毁指定的ZeroMQ上下文,释放所有资源。
    参数:context – 上下文句柄。
    返回值:如果成功,返回0;如果失败,返回-1。



  • zmq_socket – 创建套接字
    函数原型:int zmq_socket (void *context, int type)
    功能:创建一个新的套接字,指定其类型。
    参数:context – 上下文句柄;type –
    套接字类型(如ZMQ_REQ、ZMQ_REP等)。
    返回值:如果成功,返回套接字句柄;如果失败,返回-1。




  • zmq_bind – 绑定套接字到地址
    函数原型:int zmq_bind (void socket, const char endpoint)
    功能:将套接字绑定到指定的地址。
    参数:socket – 套接字句柄;endpoint – 套接字地址。
    返回值:如果成功,返回0;如果失败,返回-1。



  • zmq_connect – 连接套接字到地址
    函数原型:int zmq_connect (void *socket, const char *endpoint)
    功能:将套接字连接到指定的地址。
    参数:socket – 套接字句柄;endpoint – 套接字地址。
    返回值:如果成功,返回0;如果失败,返回-1。



  • zmq_send – 发送消息
    函数原型:int zmq_send (void *socket, const void *buffer,size_t size, int flags)
    功能:向套接字发送消息。
    参数:socket – 套接字句柄;buffer -消息缓冲区;size – 消息大小;flags – 发送选项。
    返回值:如果成功,返回实际发送的字节数;如果失败,返回-1。



  • zmq_recv – 接收消息
    函数原型:int zmq_recv (void *socket, void *buffer, size_t size, int flags)
    功能:从套接字接收消息。
    参数:socket – 套接字句柄;buffer – 消息缓冲区;size -缓冲区大小;flags – 接收选项。
    返回值:如果成功,返回实际接收的字节数;如果失败,返回-1。



  • zmq_close – 关闭套接字
    函数原型:int zmq_close (void *socket)
    功能:关闭指定的套接字,释放所有资源。
    参数:socket – 套接字句柄。
    返回值:如果成功,返回0;如果失败,返回-1。



  • zmq_setsockopt – 设置套接字选项 函数原型:int zmq_setsockopt (void *socket, int
    option_name, const void *option_value, size_t option_len)
    功能:设置套接字的选项。
    参数:socket – 套接字句柄;option_name – 选项名称;option_value -选项值


4.示例

请求/应答模式

//服务端 #include <zmq.h> #include <stdio.h> #include <string.h> int main(void) { 
    // 创建上下文 void *context = zmq_ctx_new(); // 创建套接字 void *receiver = zmq_socket(context, ZMQ_REP); // 绑定套接字到端口 zmq_bind(receiver, "tcp://127.0.0.1:5555"); while (1) { 
    // 接收消息 char buffer[10] = { 
    0 }; zmq_recv(receiver, buffer, 10, 0); printf("Received request: [%s]\n", buffer); // 发送应答 zmq_send(receiver, "World", 5, 0); } // 清理资源 zmq_close(receiver); zmq_ctx_term(context); return 0; } 
//客户端 #include <zmq.h> #include <stdio.h> #include <string.h> int main() { 
    // 创建上下文 void *context = zmq_ctx_new(); // 创建套接字 void *sender = zmq_socket(context, ZMQ_REQ); // 连接套接字到服务器 zmq_connect(sender, "tcp://127.0.0.1:5555"); // 发送请求 char buffer[10] = { 
   0}; strcpy(buffer, "Hello"); zmq_send(sender, buffer, 5, 0); // 接收应答 zmq_recv(sender, buffer, 10, 0); printf("Received response: [%s]\n", buffer); // 清理资源 zmq_close(sender); zmq_ctx_term(context); return 0; } 
//发布者 int main(void) { 
    // 创建上下文 void *context = zmq_ctx_new(); // 创建套接字 void *publisher = zmq_socket(context, ZMQ_PUB); // 绑定套接字到端口 zmq_bind(publisher, "tcp://*:5555"); while (1) { 
    // 发送消息 char buffer[10] = { 
   0}; sprintf(buffer, "Hello"); zmq_send(publisher, buffer, strlen(buffer), 0); printf("Sent message: [%s]\n", buffer); } // 清理资源 zmq_close(publisher); zmq_ctx_term(context); return 0; } 
//订阅者 int main() { 
    // 创建上下文 void *context = zmq_ctx_new(); // 创建套接字 void *subscriber = zmq_socket(context, ZMQ_SUB); // 连接套接字到服务器 zmq_connect(subscriber, "tcp://localhost:5555"); // 订阅一个主题 zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0); while (1) { 
    // 接收消息 char buffer[10] = { 
    0 }; zmq_recv(subscriber, buffer, 10, 0); printf("Received message: [%s]\n", buffer); } // 清理资源 zmq_close(subscriber); zmq_ctx_term(context); return 0; } 
//PUSH int main(void) { 
    // 创建上下文 void *context = zmq_ctx_new(); // 创建套接字 void *pusher = zmq_socket(context, ZMQ_PUSH); // 绑定套接字到端口 zmq_bind(pusher, "tcp://*:5555"); while (1) { 
    // 发送消息 char buffer[10] = { 
    0 }; sprintf(buffer, "Hello"); zmq_send(pusher, buffer, strlen(buffer), 0); printf("Sent message: [%s]\n", buffer); } // 清理资源 zmq_close(pusher); zmq_ctx_term(context); return 0; } 
//PULL int main(void) { 
    // 创建上下文 void *context = zmq_ctx_new(); // 创建套接字 void *puller = zmq_socket(context, ZMQ_PULL); // 连接套接字到服务器 zmq_connect(puller, "tcp://localhost:5555"); while (1) { 
    // 接收消息 char buffer[10] = { 
   0}; zmq_recv(puller, buffer, 10, 0); printf("Received message: [%s]\n", buffer); } // 清理资源 zmq_close(puller); zmq_ctx_term(context); return 0; } 

5.更多参考

libVLC 专栏介绍-CSDN博客

Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍_qt opengl视频播放器-CSDN博客

QCharts -1.概述-CSDN博客

日志库-Spdlog介绍

日志库-Glog介绍

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/130290.html

(0)
上一篇 2025-08-18 13:20
下一篇 2025-08-18 13:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信