cppzmq编译和使用(ubuntu22.04)

news/2024/10/17 4:40:32/

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.gitcd 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.ppmy.cn/news/478994.html

相关文章

【C#】解决HttpClient中https请求SSL证书问题

配置绕过SSL证书 var handler new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback (sender, certificate, chain, errors) > true; var client new HttpClient(Handler);

Linux常用命令——fuser命令

在线Linux命令查询工具 fuser 使用文件或文件结构识别进程 补充说明 fuser命令用于报告进程使用的文件和网络套接字。fuser命令列出了本地进程的进程号&#xff0c;那些本地进程使用file&#xff0c;参数指定的本地或远程文件。对于阻塞特别设备&#xff0c;此命令列出了使…

【工程应用八】终极的基于形状匹配方案解决(小模型+预生成模型+无效边缘去除+多尺度+各项异性+最小组件尺寸)

我估摸着这个应该是关于形状匹配或者模版匹配的最后一篇文章了&#xff0c;其实大概是2个多月前这些东西都已经弄完了&#xff0c;只是一直静不下来心整理文章&#xff0c;提醒一点&#xff0c;这篇文章后续可能会有多次修改&#xff08;但不会重新发文章&#xff0c;而是在后台…

Adb connection Error

查询了一下说是端口号5037被其他进程占用的原因 Windows中使用WinR组合键&#xff0c;调出运行&#xff0c;输入&#xff0c;cmd&#xff0c;回车&#xff0c;这是调出命令提示符的过程&#xff0c;当然你也可以用其他方法调出来 输入netstat -aon|findstr 5037查看占用该端口…

频谱仪测功率

步骤&#xff1a; 1. 按下SPAN键&#xff0c;将扫描频率设置为100MHz(测试20MHz bandwidth); 2. 按下Frequency键&#xff0c;将测试频率设置为5180(5G 36 Channel); 3. 按下Amplitude键&#xff0c;将参考功率设置为10dBm&#xff0c;太低会导致测不准&…

二维数组求和

描述 给定一个二维数组&#xff0c;请你编写一个求和函数&#xff0c;计算出这个数组元素的和 输入描述&#xff1a; 无 输出描述&#xff1a; 输出二维数组元素的和 示例1 输入&#xff1a; 无 输出&#xff1a; 5180 public class Main {public static void main(String[] ar…

freeswitch:sofia.c:5180 Invalid ext-sip-ip

具体错误是&#xff1a; 2020-06-01 19:21:36.007475 [INFO] mod_sofia.c:6247 Starting initial message thread. 2020-06-01 19:21:36.011000 [WARNING] sofia.c:5227 rtp-timeout-sec deprecated use media_timeout variable. 2020-06-01 19:21:36.011017 [WARNING] sofia.…

springboot启动异常(NoSuchBeanDefinitionException: No qualifying bean of type ‘*.BaseMapper‘)

一&#xff1a;springboot启动异常&#xff08;Unsatisfied dependency expressed through field ‘baseMapper’; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘com.yanhua.mapper.TUserMapper’ ava…