cppzmq编译和使用(ubuntu22.04)

news2024/11/26 19:59:14

libzmq

libzmq,也称为 ZeroMQ,是一个高性能、异步消息传递库,用于构建分布式和并发系统。它提供了简单而强大的原语,使得开发者可以方便地在应用程序之间进行异步通信。

以下是对 libzmq 的详细介绍:

  1. 简介:libzmq 是一个开源项目,以 C 语言实现,支持多种编程语言的绑定(包括 C++、Python、Java、Ruby 等),可运行在各种平台上,如 Windows、Linux、macOS 等。

  2. 异步消息模型:libzmq 基于消息队列模型,通过使用不同的消息模式(如请求-应答、发布-订阅等)和套接字类型来实现不同的通信方式。它支持多线程和事件驱动的设计,允许同时处理多个连接和消息。

  3. 支持多种协议:libzmq 支持多种网络传输协议,包括 TCP、UDP、in-process(进程内通信)、inter-process(进程间通信)等,使得应用程序可以在不同的环境中进行通信。

  4. 快速和低延迟:libzmq 的设计目标是具有高性能和低延迟的特点。它采用非阻塞 I/O 操作和异步事件处理,能够有效地利用系统资源和网络带宽,极大地提高通信效率。

  5. 数据模式和路由:libzmq 提供了多种数据传输模式,包括单播、多播、组播等,并支持自定义路由和策略。开发者可以根据应用场景的需求选择适当的模式和配置。

  6. 高度可扩展:libzmq 具有良好的可扩展性和灵活性,支持动态添加和移除节点,动态创建和销毁套接字,以及通过多线程和多进程实现并行处理。

  7. 多语言支持:libzmq 提供了多个语言的绑定,使得开发者可以在自己喜欢的编程语言中使用 ZeroMQ。其中,C++ 绑定(cppzmq)是基于 libzmq 的 C API 封装,提供了更加友好、简洁的接口。

总之,libzmq 是一个功能强大、易于使用且高性能的消息传递库。通过使用 libzmq,开发者可以构建分布式系统、实现异步通信和多线程处理,有效地解耦和扩展应用程序的各个组件。

cppzmq

cppzmq 是 ZeroMQ 在 C++ 中的一个封装库,依赖于 libzmq。简而言之,cppzmq 基于 libzmq 封装了更友好、简洁的 C++ 接口,使得在 C++ 环境中使用 ZeroMQ 更加方便。

具体来说,cppzmq 提供了一组类和函数,用于封装和操作 libzmq 的功能。这些类和函数提供了面向对象的编程接口,隐藏了底层 C API 的细节,并且采用了现代化的 C++ 技术和语法,使得代码更易读、易用。

通过使用 cppzmq,你可以在 C++ 程序中直接创建 ZeroMQ 的套接字、发送和接收消息,设置套接字选项,处理异常情况等等。它简化了许多繁琐的操作,减少了开发者的工作量,并提高了代码的可读性和可维护性。

需要注意的是,在使用 cppzmq 前,你需要确保已经安装并正确配置了 libzmq。cppzmq 只是对 libzmq 功能的封装,因此无法单独使用,必须依赖于 libzmq 库才能正常运行。

总结起来,cppzmq 是 libzmq 的一个 C++ 封装库,提供了更加友好、简洁的接口,使得在 C++ 环境中使用 ZeroMQ 更加方便和高效。它依赖于底层的 libzmq,并利用其强大的功能和性能来实现消息传递和异步通信。

编译和安装

1.编译安装libzmq

a.下载源码

mirrors / zeromq / libzmq · GitCode

git clone https://gitcode.net/mirrors/zeromq/libzmq.git

b.编译安装

在libzmq文件夹下打开终端,依次输入下面的指令。

mkdir build
cd build
cmake ..
sudo make -j4 install

 2.编译安装cppzmq

a.下载源码

mirrors / zeromq / cppzmq · GitCode

git clone https://gitcode.net/mirrors/zeromq/cppzmq.git

b.编译安装

在libzmq文件夹下打开终端,依次输入下面的指令。

mkdir build
cd build
cmake ..
sudo make -j4 install

3.加入vcpkg管理(非必要)

vcpkg 是一个用于 C++ 库管理的开源工具。它可以帮助开发者在 Windows、Linux 和 macOS 等平台上轻松获取、安装和管理各种 C++ 第三方库。

git clone https://github.com/Microsoft/vcpkg.git

cd vcpkg
./bootstrap-vcpkg.sh # bootstrap-vcpkg.bat for Powershell
./vcpkg integrate install
./vcpkg install cppzmq

简单验证

服务端代码

//
// 第一个简单程序, 客户端发送Hello, 服务端应答World
// 服务端
//
#include <QCoreApplication>
#include <iostream>
#include <zmq.hpp>

using std::cout;
using std::endl;
using std::cin;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    zmq::context_t context(1);  // 创建 ZeroMQ 上下文对象,参数1表示实例化一个上下文

    zmq::socket_t socket(context, ZMQ_REP);  // 创建 ZeroMQ 套接字对象,使用 ZMQ_REP 类型
    socket.bind("tcp://*:6557");  // 在指定端口绑定套接字

    cout << "服务器正在启动。" << endl;  // 输出提示信息

        while (true) {
        zmq::message_t message;

        // 等待来自客户端的下一个请求
        // 阻塞到当前语句,直到收到来自客户端的消息,然后将其存入 message 中
        [[maybe_unused]] zmq::recv_result_t len = socket.recv(message);
        cout << "接收到来自客户端的消息。" << endl;

        // 执行一些操作(处理请求)
        zmq_sleep(1);

        // 向客户端发送消息(应答)
        zmq::message_t reply(5);
        memcpy(reply.data(), "World", 5);
        socket.send(reply, zmq::send_flags::dontwait);
    }


    return a.exec();
}

客户端代码

//
// 第一个简单程序, 客户端发送Hello, 服务端应答World
// 客户端
//

#include <QCoreApplication>
#include <iostream>
#include <zmq.hpp>

using std::cout;
using std::endl;
using std::cin;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    zmq::context_t context(1);  // 创建 ZeroMQ 上下文对象,参数1表示实例化一个上下文

    zmq::socket_t socket(context, ZMQ_REQ);  // 创建 ZeroMQ 套接字对象,使用 ZMQ_REQ 类型
    socket.connect("tcp://localhost:6557");  // 连接到指定地址和端口

    cout << "客户端已连接。" << endl;  // 输出提示信息

        // 发送10次请求,每次等待响应
        for (int l = 0; l < 10; l++) {
        zmq::message_t request_msg(5);  // 创建消息对象,大小为5字节
        memcpy(request_msg.data(), "Hello", 5);  // 将字符串"Hello"复制到消息数据中
        cout << "第" << l << "次发送 Hello!" << endl;  // 输出发送次数

        socket.send(request_msg, zmq::send_flags::dontwait);  // 发送消息至服务器端

        // 接收回复
        zmq::message_t recv_msg;
        [[maybe_unused]] zmq::recv_result_t len = socket.recv(recv_msg);

        cout << "接收到 'World' 第" << l << "次" << endl;  // 输出接收次数
    }


    return a.exec();
}

输出结果

 

编译安装中的报错

FetchContent_MakeAvailable

FetchContent_MakeAvailable(Catch2) 是 CMake 中的一句命令,用于将通过 FetchContent 获取的 Catch2 库设置为可用状态。

在 CMake 中使用 FetchContent 模块可以方便地从外部源代码库下载和集成依赖项。当你在 CMakeLists.txt 文件中调用 FetchContent_MakeAvailable 命令并指定 Catch2 作为参数时,它会执行以下操作:

  1. 如果尚未下载 Catch2,则会自动下载 Catch2 的源代码,并将其放置在指定位置。
  2. 基于下载的源代码,在构建过程中生成或编译所需的 Catch2 库文件。
  3. 配置 CMake 变量和目标,以使 Catch2 库可供你的项目使用。

通过调用 FetchContent_MakeAvailable(Catch2),你可以确保在后续的构建过程中能够使用到已下载和构建的 Catch2 库。

请注意,为了使用 FetchContent_MakeAvailable,你需要在 CMake 文件顶部包含 include(FetchContent) 命令,以引入 FetchContent 模块。

缺少curl报错

 curl 是一个开源的命令行工具和库,用于进行网络请求和数据传输。它支持多种协议,例如HTTP、HTTPS、FTP、SMTP等,并提供了各种功能和选项,可以方便地执行各种网络操作。

以下是 curl 的主要特点:

  1. 支持多种协议:curl 支持常见的网络协议,包括 HTTP、HTTPS、FTP、SMTP、POP3、IMAP 等,使其适用于各种网络通信场景。

  2. 数据传输:curl 可以上传和下载文件、数据流、FTP 目录等,支持断点续传和进度显示,并提供了丰富的选项来自定义传输过程。

  3. SSL/TLS 加密支持:curl 内置了 SSL/TLS 库,可以进行加密通信,支持多种加密协议和算法,保护敏感数据在网络传输中的安全性。

  4. HTTP 客户端功能:curl 提供了全面的 HTTP 客户端功能,可以发送 GET、POST、PUT、DELETE 等请求,并支持自定义请求头、处理 Cookie、处理重定向等。

  5. 代理支持:curl 支持使用 HTTP、SOCKS4、SOCKS5 等代理服务器进行网络请求,通过代理可以实现路由、负载均衡等功能。

  6. 脚本支持:curl 可以与 shell 脚本和其他工具集成,支持脚本自动化操作和批量处理。

  7. 跨平台支持:curl 可以在多个操作系统上运行,包括 Windows、Linux、macOS 等,并提供了对应的命令行工具和库文件。

总之,curl 是一个功能强大且灵活的网络工具,适用于各种场景下的数据传输和网络操作。无论是从命令行进行简单的网络请求,还是通过编程接口进行复杂的网络通信,curl 都可以满足你的需求。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VOC数据洞察在淘宝详情页的应用与实践

本专题共10篇内容&#xff0c;包含淘宝APP基础链路过去一年在用户体验数据科学领域&#xff08;包括商详、物流、性能、消息、客服、旅程等&#xff09;一些探索和实践经验&#xff0c;本文为该专题第二篇。 在商详页基于用户动线和VOC挖掘用户决策因子带来浏览体验提升&#x…

如何使用 PowerPoint 2021 制作演示文稿(PPT)?

软件安装&#xff1a;办公神器office2021安装教程&#xff0c;让你快速上手_正经人_____的博客-CSDN博客 引言 PowerPoint 是一款非常常用的演示文稿制作工具&#xff0c;它可以帮助您创建漂亮的幻灯片&#xff0c;展示您的想法和信息。如果您是 PowerPoint 的新手&#xff…

如何选择初始化向量【密码学】(5)

目录 一、分组算法如何计算 二、什么影响算法的安全性 三、密钥的使用次数限制 一、分组算法如何计算 分组算法包括3个部分&#xff1a;数据分组&#xff0c;分组运算和链接模式。 数据分组&#xff1a;将数据分割成加密函数能够处理的数据块&#xff0c;如果不能整分&#x…

【MYSQL篇】mysql不同存储引擎中索引是如何实现的?

前言 不同的存储引擎文件是不一样&#xff0c;我们可以查看数据文件目录&#xff1a; show VARIABLES LIKE datadir;每 张 InnoDB 的 表 有 两 个 文 件 &#xff08; .frm 和 .ibd &#xff09;&#xff0c; MyISAM 的 表 有 三 个 文 件 &#xff08;.frm、.MYD、.MYI&…

简单的PWN堆栈溢出的尝试

这是一道2018年西电CTF线下赛的一道ez_pwn的小题目&#xff0c;该题目为堆栈溢出漏洞的利用1 本次实验环境为 ubuntu 20.0.4 使用工具&#xff1a;GDB pwngdb 首先分析文件大致情况 checksec ez_pwn Arch: amd64-64-little 表示该二进制文件是 64 位的 。 RELRO: Partial R…

计算机网络课程设计——中小型网络工程设计

文件地址:https://github.com/Recursiondzl/Computer-Network github里面有课设文件&#xff0c;别白嫖&#xff0c;点个star哦 摘 要&#xff1a;本次计算机网络实践&#xff0c;完成了中小型网络工程设计与实现对计算机网络知识进行了系统的复习&#xff0c;实践能力获得了…

0基础学习VR全景平台篇第45篇:编辑器底部菜单- 关联场景功能操作

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;底部菜单—关联场景功能操作。 一、本功能将用在哪里&#xff1f; 关联场景&#xff0c;是某个场景下的子场景&#xff0c;也可以理解为VR漫游作品的三级分组&…

1-简单回归问题

一.梯度下降&#xff08;gradient descent&#xff09; 1.预测函数 这里有一组样本点&#xff0c;横纵坐标分别代表一组有因果关系的变量 我们的任务是设计一个算法&#xff0c;让机器能够拟合这些数据&#xff0c;帮助我们算出参数w 我们可以先随机选一条过原点的直线&#xf…

【GESP】2023年03月图形化一级 -- 小猫捉老鼠

文章目录 小猫捉老鼠1. 准备工作2. 功能实现3. 设计思路与实现&#xff08;1&#xff09;角色、舞台背景设置a. 角色设置b. 舞台背景设置 &#xff08;2&#xff09;脚本编写a. 角色&#xff1a;Mouse1b. 角色&#xff1a;Cat 2 4. 评分标准 小猫捉老鼠 1. 准备工作 &#xff…

Vue3项目中使用vue-router

目录 1、Vue Router 的主要概念和功能2、什么是 vue-router&#xff1f;3、为什么需要 vue-router?4、基本概念和安装4.1 了解单页面应用&#xff08;SPA&#xff09;和路由的基本概念4.1.1单页面应用&#xff08;Single Page Application&#xff0c;SPA&#xff09;4.1.2路由…

【运维知识进阶篇】zabbix5.0稳定版详解3(监控Nginx+PHP服务状态信息)

这篇文章继续给大家介绍zabbix监控&#xff0c;监控Nginx、PHP等服务&#xff0c;其实非常简单&#xff0c;难点在于如何去取这个值&#xff0c;包括监控业务&#xff0c;难点在于思路是否清晰&#xff0c;思维是否活跃&#xff0c;如何去进行判断是否有这个业务&#xff0c;并…

小白到运维工程师自学之路 第三十四集 (redis的基本使用)

一、概念 Redis是一个开源的内存数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。Redis支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等。Redis的特点是数据存储在内存中&#xff0c;因此读写速度非常快&#xff0c;同时也支持数据持…

【Vue3+Ts project】认识 @vueuse/core 库

目标: 根据屏幕宽度改变 实现动态获取盒子的宽度 目录 目标: 一、javascript实现 二、vueuse/core 库实现 一、javascript实现 1.首先 window.innerWidth 获取当前屏幕宽度&#xff0c;然后将 盒子宽度 除 375 乘 当前屏幕宽度 150 / 375 * window.innerWidth 2.将获取的…

千万不要跟随这 4 种领导!

​ 见字如面&#xff0c;我是军哥&#xff01; 最近有程序员读者问我&#xff0c;什么样的领导不能跟随&#xff1f;都有哪些坑&#xff01;这个我擅长哈&#xff0c;毕竟职场混迹 15 年&#xff5e; 第一种&#xff0c;技术能力不行还喜欢指手画脚的领导。 第二种&#xff0c;…

鹏云网络分布式块存储社区版问世,首发开源存储解决方案

2023年1月&#xff0c;南京鹏云网络科技有限公司&#xff08;简称&#xff1a;鹏云网络&#xff09;正式宣布开源ZettaStor DBS分布式块存储系统&#xff0c;开放了自研10余年的分布式块存储技术&#xff0c;自此踏上了“自研”与“开源”一体并行的生态闭环之路。 研发十年&am…

python程序获取最新的行政区划名称代码

一、实现目标 最近由于项目需要,需要获取最新的过去全国县以上行政区划的名称和代码。网上虽然有一些资料,但是不是需要积分就是需要会员,而且担心这些资料不是最新的。因此,想着使用程序从官方网站上获取最新的全国行政区划数据。 二、实现思路 1、找到官方最新发布的全国…

c++11 标准模板(STL)(std::basic_ios)(五)

定义于头文件 <ios> template< class CharT, class Traits std::char_traits<CharT> > class basic_ios : public std::ios_base 类 std::basic_ios 提供设施&#xff0c;以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios…

【夜深人静学数据结构与算法 | 第七篇】时间复杂度与空间复杂度

目录 前言&#xff1a; 引入&#xff1a; 时间复杂度&#xff1a; 案例&#xff1a; 空间复杂度&#xff1a; 案例&#xff1a; TIPS&#xff1a; 总结&#xff1a; 前言&#xff1a; 今天我们将来介绍时间复杂度和空间复杂度&#xff0c;我们代码的优劣就是依…

力扣算法刷题Day38|动态规划:斐波那契数 爬楼梯 使用最小花费爬楼梯

力扣题目&#xff1a;#509. 斐波那契数 刷题时长&#xff1a;参考答案后5min 解题方法&#xff1a;动态规划 复杂度分析 时间O(n)空间O(n) 问题总结 无 本题收获 动规五部曲思路 确定dp数组以及下标的含义&#xff1a;dp[i]的定义为&#xff0c;第i个数的斐波那契数值…

VMware虚拟机彻底卸载详细教程

VMware虚拟机彻底卸载 一、彻底卸载过程1.1 停止VMware服务1.2 结束vmware任务1.3 开始卸载VMware1.4 删除注册表信息1.5 删除安装目录 二、vmware 安装教程三、vmware 使用教程 回到目录   回到末尾 一、彻底卸载过程 卸载之前&#xff0c;需要先关闭VMware相关的后台服务…