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 客户端,能发请求、收响应,帮你建立对 io_context、socket、buffer 等核心对象的直觉:
run() 启动调度io_context
boost::asio::buffer(data, size))用于读写,不是自动管理内存的容器,要确保生命周期足够长示例(无异常处理,仅示意流程):
auto ctx = boost::asio::io_context();异步本质是“发起操作 → 继续做别的事 → 操作完成时通知你”。Asio 用 completion handler(回调函数)实现,推荐用 lambda 表达式内联书写:
connect、async_write、async_read 的最后一个参数换成 lambdaconst boost::system::error_code& ec, size_t bytes_transferred
io_context.run() 调用前发起所有 async_ 操作,否则不会触发关键点:异步操作一旦发起,就不再阻塞当前线程;多个操作可并行注册,由 io_context 统一派发完成事件。
实际项目中,不能让每个 socket 都裸露在外。典型做法是定义一个 session 类:
tcp::socket、读写 buffer(比如 std::array)、可能还有解析器状态shared_from_this() 绑定 this,防止对象被提前析构(因为异步操作可能跨多个 run() 周期)ec:若为 boost::asio::error::operation_aborted,说明 socket 已关闭,不继续后续操作这是避免崩溃和资源泄漏的核心习惯,不是可选项。
服务器主线程只做一件事:监听端口、接收新连接,然后立即交给新 session 处理:
tcp::acceptor 绑定
地址、设置 reuse_address(true)
async_accept,handler 中 new 一个 session,传入刚 accept 到的 socketasync_accept,形成“接受 → 处理 → 再接受”的循环链这样主线程永不阻塞,单个 io_context 就能支撑成百上千并发连接(取决于系统配置和业务逻辑耗时)。