zeromq/cppzmq

GitHub: zeromq/cppzmq

cppzmq 是 libzmq 的轻量级 C++ 头文件绑定库,提供类型安全和 RAII 风格的 ZeroMQ 消息通信接口。

Stars: 2306 | Forks: 803

[![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/a7d8934486195653.svg)](https://github.com/zeromq/cppzmq/actions) [![Coverage Status](https://coveralls.io/repos/github/zeromq/cppzmq/badge.svg?branch=master)](https://coveralls.io/github/zeromq/cppzmq?branch=master) [![License](https://img.shields.io/github/license/zeromq/cppzmq.svg)](https://github.com/zeromq/cppzmq/blob/master/LICENSE) # 简介与设计目标 cppzmq 是 libzmq 的 C++ 绑定。它具有以下设计目标: - cppzmq 将 libzmq C API 映射为 C++ 概念。具体来说: - 它是类型安全的(libzmq C API 将各种类似类的概念暴露为 `void*`) - 它提供基于异常的错误处理(libzmq C API 提供基于 `errno` 的错误处理) - 它提供 RAII 风格的类,可自动进行资源管理(libzmq C API 要求用户注意显式释放资源) - cppzmq 是一个轻量级的、仅包含头文件的绑定。你只需要包含头文件 `zmq.hpp`(可能还需要 `zmq_addon.hpp`)即可使用它。 - `zmq.hpp` 旨在包含对 libzmq C API 提供的抽象的直接映射,而 `zmq_addon.hpp` 则提供了额外的高层抽象。 还有其他具有不同设计目标的 ZeroMQ C++ 绑定。尤其是,以下绑定都不是仅包含头文件的: - [zmqpp](https://github.com/zeromq/zmqpp) 是一个 libzmq 的高级绑定。 - [czmqpp](https://github.com/zeromq/czmqpp) 是一个基于高层 czmq API 的绑定。 - [fbzmq](https://github.com/facebook/fbzmq) 是一个与 Apache Thrift 集成的绑定,并额外提供了更高层的抽象。它需要 C++14。 # 支持的平台 - 仅支持 libzmq 本身所支持平台的一个子集。部分功能已经需要支持 C++11 的编译器。未来,可能所有功能都将需要 C++11。要构建和运行测试,需要 CMake 和 Catch。 - 预计任何 libzmq 4.x 版本都可以正常工作。DRAFT 功能可能仅适用于最近测试过的版本。目前明确测试过的 libzmq 版本包括 - 4.2.0(不带 DRAFT API) - 4.3.4(带和不带 DRAFT API) - 完全支持的平台(即 CI 会执行构建和测试) - Ubuntu 18.04 x64(使用 gcc 4.8.5、5.5.0、7.5.0) - Ubuntu 20.04 x64(使用 gcc 9.3.0、10.3.0 和 clang 12) - Visual Studio 2017 x64 - Visual Studio 2019 x64 - macOS 10.15(使用 clang 12,不带 DRAFT API) - 已知可用的其他平台: - 我们目前还没有关于其他可用平台的报告。请在此处添加你的平台。如果可以通过与 GitHub 协作的基于云的 CI 服务为它们提供 CI,邀请你添加 CI,并使其有可能被包含在上面的列表中。 - 可能可用的其他平台: - libzmq 支持的且提供了足够新的 gcc(4.8.1 或更高版本)或 clang(3.4.1 或更高版本)的任何平台 - Visual Studio 2012+ x86/x64 # 示例 这些示例至少需要 C++11。 ``` #include int main() { zmq::context_t ctx; zmq::socket_t sock(ctx, zmq::socket_type::push); sock.bind("inproc://test"); sock.send(zmq::str_buffer("Hello, world"), zmq::send_flags::dontwait); } ``` 这是一个更复杂的示例,我们在此示例中通过 TCP 和通配符端口发送和接收多部分消息。 ``` #include #include int main() { zmq::context_t ctx; zmq::socket_t sock1(ctx, zmq::socket_type::push); zmq::socket_t sock2(ctx, zmq::socket_type::pull); sock1.bind("tcp://127.0.0.1:*"); const std::string last_endpoint = sock1.get(zmq::sockopt::last_endpoint); std::cout << "Connecting to " << last_endpoint << std::endl; sock2.connect(last_endpoint); std::array send_msgs = { zmq::str_buffer("foo"), zmq::str_buffer("bar!") }; if (!zmq::send_multipart(sock1, send_msgs)) return 1; std::vector recv_msgs; const auto ret = zmq::recv_multipart( sock2, std::back_inserter(recv_msgs)); if (!ret) return 1; std::cout << "Got " << *ret << " messages" << std::endl; return 0; } ``` 有关更多示例,请参见 `examples` 目录。当在启用测试的情况下编译项目时,每个示例都会被编译为一个可执行文件。 # API 概述 要全面了解正在使用的 `zmq.hpp` API,请参阅 @brettviren 编写的这篇 [CPPZMQ 导览](https://brettviren.github.io/cppzmq-tour/index.html)。 `zmq.hpp` 中的 libzmq 绑定: 类型: * class `zmq::context_t` * enum `zmq::ctxopt` * class `zmq::socket_t` * class `zmq::socket_ref` * enum `zmq::socket_type` * enum `zmq::sockopt` * enum `zmq::send_flags` * enum `zmq::recv_flags` * class `zmq::message_t` * class `zmq::const_buffer` * class `zmq::mutable_buffer` * struct `zmq::recv_buffer_size` * alias `zmq::send_result_t` * alias `zmq::recv_result_t` * alias `zmq::recv_buffer_result_t` * class `zmq::error_t` * class `zmq::monitor_t` * struct `zmq_event_t`, * alias `zmq::free_fn`, * alias `zmq::pollitem_t`, * alias `zmq::fd_t` * class `zmq::poller_t` DRAFT * enum `zmq::event_flags` DRAFT * enum `zmq::poller_event` DRAFT 函数: * `zmq::version` * `zmq::poll` * `zmq::proxy` * `zmq::proxy_steerable` * `zmq::buffer` * `zmq::str_buffer` `zmq_addon.hpp` 中额外的高级类型和函数: 类型: * class `zmq::multipart_t` * class `zmq::active_poller_t` DRAFT 函数: * `zmq::recv_multipart` * `zmq::send_multipart` * `zmq::send_multipart_n` * `zmq::encode` * `zmq::decode` # 兼容性指南 cppzmq 的用户应遵循以下指南,以确保在将 cppzmq 升级到较新版本时不会出现中断(非详尽列表): * 除非在此处明确声明为 public,否则不要依赖 cppzmq 中定义的任何宏。 cppzmq 的使用者可以使用以下宏:`CPPZMQ_VERSION`、`CPPZMQ_VERSION_MAJOR`、`CPPZMQ_VERSION_MINOR`、`CPPZMQ_VERSION_PATCH`。 # 构建说明 构建步骤: 1. 通过 cmake 构建 [libzmq](https://github.com/zeromq/libzmq)。这将执行一次源外构建并安装构建文件 - `git clone https://github.com/zeromq/libzmq.git` - `cd libzmq` - `mkdir build` - `cd build` - `cmake ..` - `sudo make -j4 install` 2. 通过 cmake 构建 cppzmq。这将执行一次源外构建并安装构建文件 - `git clone https://github.com/zeromq/cppzmq.git` - `cd cppzmq` - `mkdir build` - `cd build` - `cmake ..` 或 `cmake -DCPPZMQ_BUILD_TESTS=OFF ..` 以跳过构建测试 - `sudo make -j4 install` 3. 或者,通过 [vcpkg](https://github.com/Microsoft/vcpkg/) 构建 cppzmq。这将执行一次源外构建并安装构建文件 - `git clone https://github.com/Microsoft/vcpkg.git` - `cd vcpkg` - `./bootstrap-vcpkg.sh`(在 Powershell 中为 bootstrap-vcpkg.bat) - `./vcpkg integrate install` - `./vcpkg install cppzmq` 使用方法: 提供了一个 cmake find package 脚本,以便你轻松包含此库。 在你的 CMakeLists.txt 中添加以下行,以包含 cpp zmq 的头文件和库文件(这也会为你包含 libzmq)。 ``` #find cppzmq wrapper, installed by make of cppzmq find_package(cppzmq) target_link_libraries(*Your Project Name* cppzmq) # 或使用 static library 进行链接 target_link_libraries(*Your Project Name* cppzmq-static) ```
标签:Bash脚本, C++, ZeroMQ, 头文件库, 数据擦除, 绑定库, 网络通信