Asio是成熟跨平台异步网络库,提供io_context事件循环、tcp::socket连接封装和buffer读写机制;示例展示同步TCP客户端流程:创建io_context、构造socket、connect、write请求、read响应。

Asio 是 C++ 中最成熟、跨平台的异步网络编程库,它不依赖 Boost(有 standalone 版本),支持 Windows I/O Completion Ports 和 Linux epoll/kqueue 等底层机制,但你无需直接和这些打交道——Asio 把它们统一成简洁的异步模型。
从同步 TCP 客户端开始,理解 Asio 的基本结构
先写一个最简 TCP 客户端,能发请求、收响应,帮你建立对 io_context、socket、buffer 等核心对象的直觉:
-
io_context 是 Asio 的“事件循环”:所有异步操作都注册到它上面,调用
run()启动调度 -
tcp::socket 封装连接,构造时需传入
io_context -
buffer(如
boost::asio::buffer(data, size))用于读写,不是自动管理内存的容器,要确保生命周期足够长
示例(无异常处理,仅示意流程):
auto ctx = boost::asio::io_context();boost::asio::ip::tcp::socket sock(ctx);
sock.connect(boost::asio::ip::tcp::endpoint(
boost::asio::ip::make_address("127.0.0.1"), 8080));
std::string req = "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n";
boost::asio::write(sock, boost::asio::buffer(req));
char buf[1024];
size_t n = boost::asio::read(sock, boost::asio::buffer(buf));
std::cout
改写为异步版本:回调 + lambda 是常用起点
异步本质是“发起操作 → 继续做别的事 → 操作完成时通知你”。Asio 用 completion handler(回调函数)实现,推荐用 lambda 表达式内联书写:
立即学习“C++免费学习笔记(深入)”;
- 把
connect、async_write、async_read的最后一个参数换成 lambda - lambda 参数固定为
const boost::system::error_code& ec, size_t bytes_transferred - 必须在
io_context.run()调用前发起所有 async_ 操作,否则不会触发
关键点:异步操作一旦发起,就不再阻塞当前线程;多个操作可并行注册,由 io_context 统一派发完成事件。
用类封装连接,管理资源与状态
实际项目中,不能让每个 socket 都裸露在外。典型做法是定义一个 session 类:
- 持有
tcp::socket、读写 buffer(比如std::array)、可能还有解析器状态 - 所有 async_ 调用都用
shared_from_this()绑定 this,防止对象被提前析构(因为异步操作可能跨多个 run() 周期) - 在 handler 中检查
ec:若为boost::asio::error::operation_aborted,说明 socket 已关闭,不继续后续操作
这是避免崩溃和资源泄漏的核心习惯,不是可选项。
服务端:acceptor 监听 + 持续接受新连接
服务器主线程只做一件事:监听端口、接收新连接,然后立即交给新 session 处理:
- 用
tcp::acceptor绑定地址、设置reuse_address(true) - 调用
async_accept,handler 中 new 一个 session,传入刚 accept 到的 socket - handler 结尾再次调用
async_accept,形成“接受 → 处理 → 再接受”的循环链
这样主线程永不阻塞,单个 io_context 就能支撑成百上千并发连接(取决于系统配置和业务逻辑耗时)。











