libzmq
libzmq,也称为 ZeroMQ,是一个高性能、异步消息传递库,用于构建分布式和并发系统。它提供了简单而强大的原语,使得开发者可以方便地在应用程序之间进行异步通信。
以下是对 libzmq 的详细介绍:
-
简介:libzmq 是一个开源项目,以 C 语言实现,支持多种编程语言的绑定(包括 C++、Python、Java、Ruby 等),可运行在各种平台上,如 Windows、Linux、macOS 等。
-
异步消息模型:libzmq 基于消息队列模型,通过使用不同的消息模式(如请求-应答、发布-订阅等)和套接字类型来实现不同的通信方式。它支持多线程和事件驱动的设计,允许同时处理多个连接和消息。
-
支持多种协议:libzmq 支持多种网络传输协议,包括 TCP、UDP、in-process(进程内通信)、inter-process(进程间通信)等,使得应用程序可以在不同的环境中进行通信。
-
快速和低延迟:libzmq 的设计目标是具有高性能和低延迟的特点。它采用非阻塞 I/O 操作和异步事件处理,能够有效地利用系统资源和网络带宽,极大地提高通信效率。
-
数据模式和路由:libzmq 提供了多种数据传输模式,包括单播、多播、组播等,并支持自定义路由和策略。开发者可以根据应用场景的需求选择适当的模式和配置。
-
高度可扩展:libzmq 具有良好的可扩展性和灵活性,支持动态添加和移除节点,动态创建和销毁套接字,以及通过多线程和多进程实现并行处理。
-
多语言支持: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 作为参数时,它会执行以下操作:
- 如果尚未下载 Catch2,则会自动下载 Catch2 的源代码,并将其放置在指定位置。
- 基于下载的源代码,在构建过程中生成或编译所需的 Catch2 库文件。
- 配置 CMake 变量和目标,以使 Catch2 库可供你的项目使用。
通过调用 FetchContent_MakeAvailable(Catch2)
,你可以确保在后续的构建过程中能够使用到已下载和构建的 Catch2 库。
请注意,为了使用 FetchContent_MakeAvailable
,你需要在 CMake 文件顶部包含 include(FetchContent)
命令,以引入 FetchContent 模块。
缺少curl报错
curl 是一个开源的命令行工具和库,用于进行网络请求和数据传输。它支持多种协议,例如HTTP、HTTPS、FTP、SMTP等,并提供了各种功能和选项,可以方便地执行各种网络操作。
以下是 curl 的主要特点:
-
支持多种协议:curl 支持常见的网络协议,包括 HTTP、HTTPS、FTP、SMTP、POP3、IMAP 等,使其适用于各种网络通信场景。
-
数据传输:curl 可以上传和下载文件、数据流、FTP 目录等,支持断点续传和进度显示,并提供了丰富的选项来自定义传输过程。
-
SSL/TLS 加密支持:curl 内置了 SSL/TLS 库,可以进行加密通信,支持多种加密协议和算法,保护敏感数据在网络传输中的安全性。
-
HTTP 客户端功能:curl 提供了全面的 HTTP 客户端功能,可以发送 GET、POST、PUT、DELETE 等请求,并支持自定义请求头、处理 Cookie、处理重定向等。
-
代理支持:curl 支持使用 HTTP、SOCKS4、SOCKS5 等代理服务器进行网络请求,通过代理可以实现路由、负载均衡等功能。
-
脚本支持:curl 可以与 shell 脚本和其他工具集成,支持脚本自动化操作和批量处理。
-
跨平台支持:curl 可以在多个操作系统上运行,包括 Windows、Linux、macOS 等,并提供了对应的命令行工具和库文件。
总之,curl 是一个功能强大且灵活的网络工具,适用于各种场景下的数据传输和网络操作。无论是从命令行进行简单的网络请求,还是通过编程接口进行复杂的网络通信,curl 都可以满足你的需求。