← 返回信息流
GitHub 热榜GitHub Trending · 日·2 小时前

Asio C++ 异步网络库

原标题:chriskohlhoff/asio
C++6,034 stars+87 今日

速览

基于 Proactor 设计模式,支持 TCP/UDP、SSL、定时器、信号等异步操作;是 Boost.Asio 的独立演化版本,并被纳入 C++ 标准网络库 TS。广泛应用于高并发服务器、实时系统及嵌入式开发。

AI 深度解读

这是什么

chriskohlhoff/asio 是 C++ 异步 I/O 库(Asynchronous I/O library)的参考实现,最初作为 Boost 库的一部分,后分离为独立版本(Standalone Asio)。当前版本 1.38.1(发布于 2026‑05‑14),采用 C++17 为主的标准,支持网络编程、定时器、信号处理、串口通信等异步操作。项目托管在 GitHub,主语言 C++,获得 6034 颗星,维护者 Christopher Kohlhoff 也是 Boost.Asio 的设计者。

解决的问题

传统基于阻塞 I/O 或手动线程池的服务器模型面临资源浪费和扩展性问题:

  • 每个连接一个线程在高并发下导致上下文切换开销剧增,内存占用随连接数线性增长。
  • 手动管理事件循环和回调容易产生竞态与死锁。
  • 跨平台系统调用(如 selectepollkqueueIOCP)接口差异巨大,移植工作繁琐。

ASIO 提供了一个统一的异步编程模型,将操作系统底层的 I/O 完成端口 / 多路复用机制封装成可跨平台的 C++ 接口,使开发者能用相同的代码在 Linux(epoll)、macOS(kqueue)、Windows(IOCP)等系统上编写高性能网络应用。

核心功能

  • 异步 TCP/UDP socket:支持 async_connectasync_readasync_write 等非阻塞操作,配合 completion handler 或 C++20 coroutines(co_await)使用。
  • 定时器steady_timersystem_timer,用于超时控制、心跳检测、周期性任务。
  • 信号处理signal_set 允许捕获系统信号(如 SIGINT、SIGTERM)并触发异步回调。
  • 串口通信serial_port 支持异步读写串口设备,适用于嵌入式与工业控制。
  • 自定义 I/O 对象:通过 basic_stream_socket 模板机制和 io_context,用户可扩展协议或封装底层硬件。
  • 协程支持:基于 C++20 std::coroutineasio::awaitableco_spawn,将异步回调改写为顺序代码风格。
  • 内存分配优化asio::handler_typerecycling_allocator 帮助减少动态内存分配开销。

亮点 / 与同类相比

| 对比项 | ASIO(Standalone) | Boost.Asio | libuv | 其他(如 Boost.Beast) | |--------|---------------------|------------|-------|-------------------------| | 标准依赖 | 纯 C++17,无 Boost 依赖 | 需 Boost 环境 | C 接口,需 C++ 封装 | 基于 ASIO 的上层库 | | 协程支持 | 原生 C++20 coroutine | 同左,但需 Boost.Coroutine 过渡 | 无 | 依赖底层 ASIO | | 跨平台能力 | epoll/kqueue/IOCP 统一抽象 | 同左 | 仅网络层,无串口 | 依赖 ASIO | | 内存控制 | 提供 allocator 定制点 | 同左 | 需手动管理 | 依赖 ASIO 策略 | | 性能对齐 | 可零拷贝,与零开销原则对齐 | 同左 | 性能优秀,但无 C++ RAII | 依赖 ASIO |

ASIO 的核心优势在于 C++ 原生集成 + 零开销抽象:不需要 C 风格回调,不需要额外运行时,完全利用模板和 io_context 的 Proactor 模式(在 POSIX 系统上实际以 Reactor 模式模拟 Proactor)。与 libuv 相比,ASIO 的接口更贴近 C++ 标准库风格,并且可以直接与 std::error_codestd::future 和 coroutine 互操作。

适合谁用 / 上手

目标用户

  • 需要构建高性能网络服务的 C++ 开发者(游戏服务器、实时通信、IoT 网关)。
  • 需要跨平台异步 I/O 的底层系统程序员(如嵌入式设备控制、串口通信)。
  • 希望从 select/ poll 迁移到现代异步模型的 C++ 项目维护者。
  • 研究异步 I/O 实现原理的进阶学习者(ASIO 代码本身是很好的教材)。

快速上手(以 v1.38.1 为例):

  1. 下载源码或使用包管理器(如 vcpkg、Conan)。Standalone 版本仅需包含 asio.hpp 头文件,无需链接其他库。
  2. 创建最简单的 echo server(TCP):
    #include <asio.hpp>
    using asio::ip::tcp;
    
    int main() {
        asio::io_context io_context;
        tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 12345));
    
        while (true) {
            tcp::socket socket(io_context);
            acceptor.accept(socket);
    
            char data[1024];
            size_t len = socket.read_some(asio::buffer(data));
            asio::write(socket, asio::buffer(data, len));
        }
        return 0;
    }
    
  3. 编译时需使用 -std=c++17,部分高级特性(协程)需 C++20。
  4. 参考官方文档(位于 doc/index.htmlthink-async.com)的 tutorial 章节,覆盖基础同步/异步示例、多线程 io_context 并发、SSL 支持(需另加 OpenSSL)等。

注意:ASIO 旧版本(<1.24)曾大量依赖 Boost,当前 1.38.1 已完全独立,建议直接使用 standalone 版本以避免依赖冲突。

查看原文 →github.com