深入学习 Boost.Asio(三):协程进阶与实战项目

系列导航:入门篇 | 进阶篇 | 实战篇 前置知识 阅读本篇前,请确保已掌握: 入门篇:io_context、异步操作生命周期、定时器 进阶篇:协程 Echo Server、多线程模型、strand 1. 协程进阶技巧 1.1 co_spawn 的第三个参数 co_spawn 的第三个参数决定了协程完成后的行为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 #include <boost/asio.hpp> #include <boost/asio/co_spawn.hpp> #include <boost/asio/detached.hpp> #include <boost/asio/use_awaitable.hpp> using boost::asio::awaitable; using boost::asio::use_awaitable; awaitable<int> compute() { co_return 42; } awaitable<void> mayFail() { throw std::runtime_error("oops"); co_return; } void examples(boost::asio::io_context& ioCtx) { // 方式1:detached —— 忽略返回值和异常 // 适用:独立运行的协程(如连接处理) boost::asio::co_spawn(ioCtx, compute(), boost::asio::detached); // 方式2:回调 —— 协程完成时执行回调 // 适用:需要捕获协程异常或获取返回值 boost::asio::co_spawn(ioCtx, mayFail(), [](std::exception_ptr e) { if (e) { try { std::rethrow_exception(e); } catch (const std::exception& ex) { std::cerr << "协程异常: " << ex.what() << "\n"; } } }); // 方式3:use_awaitable —— 在协程中等待另一个协程 // 适用:父子协程关系 // (需要在协程内使用) } // 方式3 完整示例 awaitable<void> parent(boost::asio::io_context& ioCtx) { // 等待子协程完成并获取返回值 int result = co_await boost::asio::co_spawn( ioCtx, compute(), boost::asio::use_awaitable); std::cout << "子协程返回: " << result << "\n"; // 42 } 1.2 超时控制 生产环境中,你不能无限等待一个操作完成。Asio 提供了 awaitable_operators 实现竞争式等待: ...

May 21, 2026 · 10 min · 1926 words

深入学习 Boost.Asio(二):TCP 编程与多线程模型

系列导航:入门篇 | 进阶篇 | 实战篇 前置知识 阅读本篇前,请确保已理解 入门篇 中的以下概念: io_context 的作用和 run() 执行流程 异步操作的生命周期(发起 → 完成 → handler 执行) post/dispatch 的区别 1. TCP 编程:三步演进 我们通过构建一个 Echo Server(收到什么就回什么),从最简单的同步版本逐步演进到生产级协程版本。 1.1 第一步:同步阻塞版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 // echo_server_sync.cpp // 编译: g++ -std=c++20 echo_server_sync.cpp -lboost_system -lpthread -o echo // 测试: 另开终端 nc localhost 9999,输入文字会回显 #include <boost/asio.hpp> #include <iostream> using boost::asio::ip::tcp; int main() { boost::asio::io_context ioCtx; // 创建 acceptor:监听 TCP 连接 // 参数:io_context, 绑定地址(IPv4, 端口9999) tcp::acceptor acceptor(ioCtx, tcp::endpoint(tcp::v4(), 9999)); std::cout << "同步 Echo Server 监听端口 9999\n"; while (true) { // accept() 阻塞,直到有客户端连接 tcp::socket socket(ioCtx); acceptor.accept(socket); std::cout << "客户端连接: " << socket.remote_endpoint().address().to_string() << ":" << socket.remote_endpoint().port() << "\n"; // 处理这个连接(阻塞:处理期间无法接受新连接!) boost::system::error_code ec; char buf[1024]; while (true) { // read_some:读取可用的数据(可能只有一部分) size_t n = socket.read_some(boost::asio::buffer(buf), ec); if (ec == boost::asio::error::eof) { std::cout << "客户端断开\n"; break; } if (ec) throw boost::system::system_error(ec); // 将收到的数据原样写回 boost::asio::write(socket, boost::asio::buffer(buf, n)); } } return 0; } 问题:同一时刻只能服务一个客户端。当客户端 A 连接后,客户端 B 必须等 A 断开才能被接受。 ...

May 20, 2026 · 10 min · 2026 words

深入学习 Boost.Asio(一):从原理到 io_context

系列导航:入门篇 | 进阶篇 | 实战篇 引言:为什么需要异步 I/O? 假设你在写一个聊天服务器,同时连接 1000 个用户。如果用传统的"一个线程处理一个连接"模型: 1 2 3 4 线程1: read(socket_1) ← 阻塞等待用户1输入... 线程2: read(socket_2) ← 阻塞等待用户2输入... ... 线程1000: read(socket_1000) ← 阻塞等待用户1000输入... 问题:1000 个线程各自阻塞在 read() 上,每个线程占用 ~1MB 栈内存(合计 ~1GB),还有大量的上下文切换开销。这就是经典的 C10K 问题。 异步 I/O 的解决思路:用 1 个线程(或少量线程)管理所有连接,操作系统在数据就绪时通知我们: 1 2 3 4 5 6 单线程事件循环: ┌→ 等待事件(epoll/IOCP) │ ├─ socket_7 可读 → 处理用户7的消息 │ ├─ socket_42 可读 → 处理用户42的消息 │ └─ socket_100 可写 → 继续发送给用户100 └─ 回到等待 Boost.Asio 就是 C++ 中实现这一模型的工业级库。本篇将带你理解它的底层原理和核心组件。 ...

May 18, 2026 · 10 min · 1990 words

Boost.MySQL 学习课程:异步数据库访问

课程导航:学习路径 | Boost.System | Boost.Asio | Boost.Beast | Boost.JSON | Boost.MySQL 前置知识 课程 1: Boost.System(error_code、system_error) 课程 2: Boost.Asio(io_context、协程、co_await + use_awaitable) SQL 基础(SELECT/INSERT/UPDATE/DELETE、事务) MySQL 数据库基本操作 学习目标 完成本课程后,你将能够: 理解 Boost.MySQL 的类型擦除连接模型(any_connection) 使用 C++20 协程执行异步数据库操作 掌握参数化查询和 PreparedStatement 防 SQL 注入 理解结果集类型体系(results / static_results) 实现事务控制(BEGIN/COMMIT/ROLLBACK) 读懂 Hical 的连接池、Statement 缓存和数据库中间件设计 目录 前置知识 学习目标 目录 1. 核心概念 1.1 Boost.MySQL 的定位 1.2 连接类型体系 1.3 查询执行模型 1.4 结果集类型体系 2. 基础用法 2.1 建立连接 2.2 执行文本查询 2.3 参数化查询(客户端格式化) 2.4 PreparedStatement 2.5 结果集遍历 2.6 事务控制 3. 进阶主题 3.1 类型擦除连接 any_connection 3.2 静态类型结果集 static_results 3.3 多结果集(存储过程) 3.4 连接池 connection_pool 3.5 错误处理与诊断 4. Hical 实战解读 4.1 MysqlConnection:any_connection 的框架封装 4.2 StmtCache:LRU PreparedStatement 缓存 4.3 DbConnectionPool:协程式连接池 4.4 DbMiddleware:请求级连接生命周期 4.5 DbQueryLog:查询日志装饰器 4.6 完整请求处理流程 5. 练习题 练习 1:协程式 CRUD 练习 2:参数化查询实战 练习 3:事务与错误处理 练习 4:LRU 缓存设计 练习 5(挑战):连接池实现 6. 总结与拓展阅读 核心 API 速查表 查询方式对比 拓展阅读 课程回顾 1. 核心概念 1.1 Boost.MySQL 的定位 Boost.MySQL 是一个纯异步的 MySQL 客户端库,直接实现 MySQL 客户端/服务器协议(不依赖 libmysqlclient),天然集成 Boost.Asio 的异步模型。 ...

April 29, 2026 · 38 min · 7911 words

Boost 库学习课程 — 学习路径导航

本系列以 Hical 框架源码为实战案例,系统讲解项目使用的 5 个核心 Boost 库。 本系列与 Hical 框架系列的关系 系列 视角 目标读者 Hical 框架系列(01-05) 框架怎么设计 想理解 Hical 架构的人 Boost 学习课程 Boost 库怎么用 想掌握 Boost 库本身的人 同一段源码(如 TcpServer::acceptLoop()),Blog 讲 “为什么用协程做 accept 循环”,本系列讲 "async_accept + use_awaitable 的 API 语义是什么"。 学习路径 1 2 3 4 5 6 7 8 9 10 11 课程 1: Boost.System ← 最基础,error_code 是所有 I/O 操作的返回值 │ ▼ 课程 2: Boost.Asio ← 核心 I/O 引擎,依赖 error_code │ ├───────────────┐ ▼ ▼ 课程 3: Boost.Beast 课程 5: Boost.MySQL ← 都构建在 Asio 异步模型之上 │ ▼ 课程 4: Boost.JSON ← 数据层,与 HTTP 请求/响应及数据库结果配合 课程概览 # 课程 核心主题 前置依赖 预计时长 1 Boost.System 统一错误码、error_category、跨平台映射 C++ 基础 1-2 小时 2 Boost.Asio io_context、协程、TCP、定时器、多线程模型 课程 1 4-6 小时 3 Boost.Beast HTTP 消息模型、Parser、WebSocket、SSL 课程 1+2 3-4 小时 4 Boost.JSON 值类型体系、解析/序列化、PMR 集成、反射 课程 1 2-3 小时 5 Boost.MySQL 协程式数据库访问、连接池、PreparedStatement 缓存 课程 1+2 3-5 小时 各课程一句话摘要 课程 1 — Boost.System:理解 error_code + error_category 体系,掌握 I/O 操作的两种错误处理模式(错误码 vs 异常)。 课程 2 — Boost.Asio:从 io_context 出发,掌握 C++20 协程式异步 I/O,学会 TCP 服务器、定时器和多线程模型。 课程 3 — Boost.Beast:在 Asio 之上构建 HTTP/WebSocket 协议层,学会请求解析、响应构建和 WebSocket 消息循环。 课程 4 — Boost.JSON:掌握 JSON 值类型操作、PMR 高性能分配,以及 Hical 反射层如何实现自动序列化。 课程 5 — Boost.MySQL:掌握协程式异步数据库访问、参数化查询防注入、连接池设计,以及 Hical 的 Statement 缓存与数据库中间件。 开发环境准备 编译器要求 编译器 推荐版本 GCC 14+ Clang 20+ MSVC 2022 Boost 安装 Linux (apt): ...

April 15, 2026 · 2 min · 259 words

Boost.Asio 学习课程:异步 I/O 与协程

课程导航:学习路径 | Boost.System | Boost.Asio | Boost.Beast | Boost.JSON | Boost.MySQL 前置知识 课程 1: Boost.System(error_code、system_error) C++ 基础:模板、lambda、智能指针 C++20 协程语法(co_await、co_return)——本课程会从零讲解 学习目标 完成本课程后,你将能够: 理解 io_context 的工作原理和生命周期管理 掌握 C++20 协程式异步编程(co_await + use_awaitable) 编写协程式 TCP 服务器和客户端 使用 steady_timer 实现定时任务 理解多线程模型的选型和 strand 序列化 读懂 Hical 的 EventLoop、连接管理和 SSL 集成 目录 前置知识 学习目标 目录 1. 核心概念 1.1 Asio 的设计哲学 1.2 io_context:事件循环的心脏 1.3 Executor 模型:post vs dispatch 1.4 三种异步完成方式 2. 基础用法 2.1 最小 io_context 示例 2.2 TCP 基础:同步与异步 2.3 协程式异步 I/O 2.4 steady_timer 定时器 2.5 buffer 操作 3. 进阶主题 3.1 多线程模型 3.2 strand 序列化执行 3.3 SSL/TLS 支持 3.4 signal_set 信号处理 4. Hical 实战解读 4.1 AsioEventLoop:io_context 的框架封装 4.2 dispatch vs post 实战 4.3 EventLoopPool:多线程池模型 4.4 AsioTimer:定时器的生产级封装 4.5 TcpServer:协程式 accept 循环 4.6 Coroutine.h:协程工具函数 4.7 SSL 集成 5. 练习题 练习 1:协程式 Echo Server 练习 2:周期性日志 练习 3:多 io_context 模型 练习 4:SSL Echo Server 练习 5:协程式 HTTP 客户端 参考答案 练习 1 参考答案:协程式 Echo Server 练习 2 参考答案:周期性日志 练习 3 参考答案:多 io_context 模型 练习 4 参考答案:SSL Echo Server 练习 5 参考答案:协程式 HTTP 客户端 6. 总结与拓展阅读 核心 API 速查表 三种异步模式对比 拓展阅读 下一步 1. 核心概念 1.1 Asio 的设计哲学 Boost.Asio 采用 Proactor 模式——应用程序发起异步操作,操作系统完成后通知应用。 ...

April 15, 2026 · 20 min · 4250 words

Boost.Beast 学习课程:HTTP 与 WebSocket

课程导航:学习路径 | Boost.System | Boost.Asio | Boost.Beast | Boost.JSON | Boost.MySQL 前置知识 课程 1: Boost.System(error_code、system_error) 课程 2: Boost.Asio(io_context、协程、TCP socket) HTTP 协议基础(请求/响应格式、状态码、头部) 学习目标 完成本课程后,你将能够: 理解 Beast 的 HTTP message 模型和 Body 类型系统 使用 Parser 安全解析 HTTP 请求(含 body_limit 保护) 编写协程式 HTTP 服务端和客户端 实现 WebSocket 升级和消息循环 读懂 Hical 的 HttpServer、HttpRequest/Response 封装和 WebSocket 集成 目录 前置知识 学习目标 目录 1. 核心概念 1.1 Beast 的定位 1.2 HTTP message 模型 1.3 Buffer 体系 1.4 Parser 与安全限制 2. 基础用法 2.1 构建 HTTP 请求和响应 2.2 协程式 HTTP 服务端 2.3 Parser 高级用法 3. 进阶主题 3.1 WebSocket 3.2 自定义 Body 类型 3.3 超时机制 4. Hical 实战解读 4.1 handleSession:完整 HTTP 处理循环 4.2 HttpRequest/Response 封装 4.3 WebSocketSession 封装 4.4 handleWebSocket:升级与消息循环 4.5 错误处理模式 5. 练习题 练习 1:基础 HTTP 服务端 练习 2:body_limit 保护 练习 3:WebSocket Echo Server 练习 4:Keep-Alive 练习 5(挑战):静态文件服务器 参考答案 练习 1 参考答案:基础 HTTP 服务端 练习 2 参考答案:body_limit 保护 练习 3 参考答案:WebSocket Echo Server 练习 4 参考答案:Keep-Alive 练习 5 参考答案:静态文件服务器 6. 总结与拓展阅读 Beast 核心 API 速查表 HTTP 请求处理数据流 拓展阅读 下一步 1. 核心概念 1.1 Beast 的定位 Beast 是协议实现库,不是 Web 框架。它在 Asio 之上添加 HTTP/WebSocket 协议的解析和序列化,但不提供路由、中间件等应用层功能(这些由 Hical 提供)。 ...

April 15, 2026 · 19 min · 3882 words

Boost.JSON 学习课程:JSON 序列化与反序列化

课程导航:学习路径 | Boost.System | Boost.Asio | Boost.Beast | Boost.JSON | Boost.MySQL 前置知识 课程 1: Boost.System(error_code 用于安全解析) C++ 基础:模板、if constexpr、可变参数模板 JSON 数据格式基础 学习目标 完成本课程后,你将能够: 掌握 Boost.JSON 的值类型体系(value/object/array) 安全解析和序列化 JSON 数据 理解 PMR 分配器如何加速 JSON 操作 读懂 Hical 的 MetaJson 反射层——自动 JSON 序列化的实现原理 目录 前置知识 学习目标 目录 1. 核心概念 1.1 Boost.JSON vs 其他 JSON 库 1.2 值类型体系 1.3 构造与访问 2. 基础用法 2.1 创建 JSON 值 2.2 解析 JSON 字符串 2.3 序列化为字符串 2.4 访问和修改 2.5 类型转换 3. 进阶主题 3.1 PMR 分配器集成 3.2 增量解析 3.3 tag_invoke 自定义序列化 3.4 错误处理 4. Hical 实战解读 4.1 HttpRequest::jsonBody() 4.2 HttpResponse::setJsonBody() 4.3 HttpResponse::json() 工厂 4.4 MetaJson.h:反射驱动的自动序列化 4.5 PMR 与 JSON 的协同 5. 练习题 练习 1:JSON 解析与提取 练习 2:HICAL_JSON 宏实战 练习 3:安全 JSON 验证器 练习 4:PMR 性能对比 练习 5(挑战):扩展 valueToJson 参考答案 练习 1 参考答案:JSON 解析与提取 练习 2 参考答案:HICAL_JSON 宏实战 练习 3 参考答案:安全 JSON 验证器 练习 4 参考答案:PMR 性能对比 练习 5 参考答案:扩展 valueToJson 支持 optional 6. 总结与拓展阅读 C++ 类型 ↔ JSON 类型映射表 API 速查表 拓展阅读 课程回顾 1. 核心概念 1.1 Boost.JSON vs 其他 JSON 库 特性 Boost.JSON nlohmann::json RapidJSON simdjson 接口风格 Boost 风格 STL 风格 SAX/DOM 只读 PMR 支持 原生 无 自定义 Allocator 无 增量解析 stream_parser 无 SAX API 无 编译速度 快(header-only 可选) 慢 快 快 可变性 读写 读写 读写 只读 Boost 集成 天然 独立 独立 独立 Hical 选择 Boost.JSON 的原因: ...

April 15, 2026 · 18 min · 3645 words

Boost.System 学习课程:错误处理基石

课程导航:学习路径 | Boost.System | Boost.Asio | Boost.Beast | Boost.JSON | Boost.MySQL 前置知识 C++ 基础(类、模板、异常处理) 了解操作系统错误码概念(errno、GetLastError) 学习目标 完成本课程后,你将能够: 理解 error_code + error_category 的设计原理 掌握 I/O 操作中 错误码 和 异常 两种错误处理模式 编写自定义 error_category 读懂 Hical 的跨平台错误码映射层 目录 前置知识 学习目标 目录 1. 核心概念 1.1 为什么需要统一的错误码体系 1.2 error_code 三要素 1.3 error_category 体系 1.4 error_condition vs error_code 2. 基础用法 2.1 创建和检查 error_code 2.2 两种错误处理模式 2.3 常见错误码速查表 3. 进阶主题 3.1 自定义 error_category 3.2 跨平台错误码映射 4. Hical 实战解读 4.1 Error.h:框架级错误码枚举 4.2 Error.cpp:fromBoostError 跨平台映射 4.3 错误码在连接管理中的使用 4.4 设计模式总结 5. 练习题 练习 1:error_code 基础 练习 2:自定义 error_category 练习 3:阅读源码 参考答案 练习 1 参考答案 练习 2 参考答案 练习 3 参考答案 6. 总结与拓展阅读 核心要点 拓展阅读 下一步 1. 核心概念 1.1 为什么需要统一的错误码体系 C 语言 errno 的问题: ...

April 15, 2026 · 12 min · 2361 words