C++Day4 Boost.Asio Boost.Beast
Boost
C++ 刚诞生时,自带的标准库(STL)功能很少:
只有容器、字符串、基础算法、IO;
没有网络、日期时间、线程、正则、异步 IO、智能指针、文件系统、序列化等常用工具;
不同编译器(VC/GCC/Clang)扩展各不兼容,写跨平台代码很痛苦。
2000 年左右一群 C++ 大牛,把大量高质量、跨平台的通用工具库整合在一起,这个集合就叫 Boost。
一句话:Boost 是一套免费、开源、跨平台的 C++ 扩展工具库合集。
Boost.Asio
Asio = Asynchronous Input Output,异步输入输出。
Boost.Asio 是一套跨平台、统一封装的异步 IO 底层网络库。
只负责传输层:TCP、UDP、本地套接字、串口、管道、定时器;
不处理 HTTP、WebSocket(上层交给 Boost.Beast);
提供两套编程模型:同步阻塞、异步非阻塞,现代 C++ 支持协程。
核心基础组件
- io_context(事件上下文 / 事件循环)
整个 Asio 程序的心脏,管理所有 IO 事件、任务队列。
作用:
存放所有 socket、定时器注册的 IO 事件;
分发就绪事件,执行回调 / 协程;
统一调度异步任务。
boost::asio::io_context ioc;
// 启动事件循环,阻塞等待事件发生
ioc.run();
- executor 执行器
io_context 内部负责调度任务的抽象,所有异步操作都绑定执行器。
不用手动创建,socket / 定时器会自动持有,协程、多线程调度底层都靠 executor。 - ip::tcp /ip::udp 协议封装
统一封装网络协议族,提供:
tcp::socket:TCP 读写套接字
tcp::acceptor:TCP 服务端监听器,接收客户端连接
tcp::resolver:域名解析(域名转 IP)
udp::socket:无连接 UDP 套接字
io_context(事件循环)
↓
tcp::acceptor / tcp::socket(操作系统socket句柄封装)
↓
Boost.Beast http::stream<tcp::socket>(上层HTTP协议封装)
- buffer 缓冲区
Asio 统一的读写内存抽象,解决原生 char * 裸指针安全问题:
buffer():包装数组 /string/vector,零拷贝转发底层系统调用;
读:socket.async_read_some(buffer(buf));
写:socket.async_write_some(buffer(“hello”))。 - steady_timer /system_timer 定时器
不依赖 socket,纯 IO 事件,实现定时、超时控制:
boost::asio::steady_timer timer(ioc, std::chrono::seconds(3));
timer.async_wait([](auto ec){}); // 3秒后回调执行
网络连接超时、心跳检测全靠它。
- error_code 错误码
统一跨平台错误类型,替代 errno、Windows GetLastError:
异步回调第一个参数固定boost::system::error_code ec;
!ec代表无错误,ec包含系统错误信息(连接断开、超时、被取消等)。
两种编程模型:同步 vs 异步
模型 1:同步阻塞(简单但不适合高并发)
调用 read/write/connect 会卡住当前线程,直到操作完成。
tcp::socket sock(ioc);
sock.connect(tcp::endpoint(net::ip::address::from_string("127.0.0.1"), 8080));
std::string buf(1024, 0);
sock.read_some(buffer(buf)); // 线程阻塞,有数据才返回
缺点:一万连接就要一万线程,内存暴涨、内核切换开销大,仅适合简单工具、客户端脚本。
模型 2:异步非阻塞(Asio 核心,高并发服务必用)
核心思想:发起操作不等待,事件就绪后自动执行回调
执行流程拆解:
调用async_xxx(async_connect/async_read/async_accept),向 io_context 注册事件;
函数立刻返回,线程继续做其他事,不阻塞;
内核有数据 / 连接到达,io_context 捕获就绪事件;
io_context 调度执行你传入的 lambda 回调函数。
void on_read(boost::system::error_code ec, std::size_t len)
{
if(!ec)
{
// 读到len字节数据,处理业务
}
}
tcp::socket sock(ioc);
// 注册异步读,有数据自动调用on_read
sock.async_read_some(buffer(buf), on_read);
ioc.run(); // 启动循环等待事件
Boost.Beast
Boost.Beast 是 Boost 库中的应用层网络协议库,完全基于 Boost.Asio 开发;这个网络协议子库的名字,直译 “野兽”,寓意高性能、高并发吞吐
和 Asio 的层级关系
Asio:底层 socket、事件循环、IO 多路复用、定时器
Beast:基于 Asio 封装 HTTP/WebSocket 应用层协议
二者是上下级关系,所有 Beast 代码都必须依赖 Asio。
操作系统内核:epoll / IOCP / kqueue
↑
Boost.Asio:io_context、tcp::socket、定时器、SSL流、异步事件循环(传输层)
↑
Boost.Beast:HTTP报文解析、WebSocket帧、握手、分块传输(应用层协议)
↑
业务代码:接口路由、Cookie、Session、业务逻辑
三大核心模块
模块 1:HTTP 模块 #include <boost/beast/http.hpp>
专门处理标准 HTTP/1.x 报文,解决粘包、分片、Header 解析、Chunked 分块传输等问题。
模块 2:WebSocket 模块 #include <boost/beast/websocket.hpp>
实现标准 WebSocket 全双工长连接,自动处理 HTTP Upgrade 握手、消息分片、控制帧。
模块 3:SSL 加密模块 #include <boost/beast/ssl.hpp>
基于 Asio 的 ssl::stream 封装,一键给 HTTP/WebSocket 开启 TLS:
http::stream<ssl::streamtcp::socket> → HTTPS
websocket::stream<ssl::streamtcp::socket> → WSS
需要 OpenSSL 库支持,用于生产环境加密通信。
HTTP 服务端完整运行流程
创建 io_context 事件循环、tcp::acceptor 监听端口;
acceptor.async_accept 异步等待客户端 TCP 连接;
连接到来,拿到 tcp::socket,包装为 http::streamtcp::socket;
调用 stream.async_read 读取客户端发送的 HTTP 原始字节;
Beast 解析 flat_buffer 中的数据,生成完整 request 对象;
业务处理:读取 URL、Header、Cookie,执行业务逻辑;
构造 response,调用 stream.async_write 返回给客户端;
可选开启 Keep-Alive,循环读取下一次请求;
连接断开 / 超时销毁流资源。
WebSocket 握手升级流程
客户端发起普通 HTTP 请求,携带头 Upgrade: websocket、Connection: Upgrade;
服务端通过 websocket::stream::async_accept() 校验握手报文;
返回 101 Switching Protocols 响应,TCP 连接升级为双向 WS 长连接;
之后不再走 HTTP,全部收发 WS 消息帧。
更多推荐

所有评论(0)