cppzmq编译和使用(ubuntu22.04)

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 都可以满足你的需求。

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zw_ggr_2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值