zeromq/cppzmq
GitHub: zeromq/cppzmq
cppzmq 是 libzmq 的轻量级 C++ 头文件绑定库,提供类型安全和 RAII 风格的 ZeroMQ 消息通信接口。
Stars: 2306 | Forks: 803
[](https://github.com/zeromq/cppzmq/actions)
[](https://coveralls.io/github/zeromq/cppzmq?branch=master)
[](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, 头文件库, 数据擦除, 绑定库, 网络通信