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++ 支持协程。

核心基础组件

  1. io_context(事件上下文 / 事件循环)
    整个 Asio 程序的心脏,管理所有 IO 事件、任务队列。
    作用:
    存放所有 socket、定时器注册的 IO 事件;
    分发就绪事件,执行回调 / 协程;
    统一调度异步任务。
boost::asio::io_context ioc;
// 启动事件循环,阻塞等待事件发生
ioc.run();
  1. executor 执行器
    io_context 内部负责调度任务的抽象,所有异步操作都绑定执行器。
    不用手动创建,socket / 定时器会自动持有,协程、多线程调度底层都靠 executor。
  2. 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协议封装)
  1. buffer 缓冲区
    Asio 统一的读写内存抽象,解决原生 char * 裸指针安全问题:
    buffer():包装数组 /string/vector,零拷贝转发底层系统调用;
    读:socket.async_read_some(buffer(buf));
    写:socket.async_write_some(buffer(“hello”))。
  2. steady_timer /system_timer 定时器
    不依赖 socket,纯 IO 事件,实现定时、超时控制:
boost::asio::steady_timer timer(ioc, std::chrono::seconds(3));
timer.async_wait([](auto ec){}); // 3秒后回调执行

网络连接超时、心跳检测全靠它。

  1. 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 消息帧。

更多推荐