c++如何用Asio库进行异步编程_c++ Boost.Asio/Standalone Asio网络编程【实战】

裘德小鎮的故事

裘德小鎮的故事

2025-12-31

676人浏览

原创

asio异步编程核心是“不等结果、先干别的”,依赖回调或协程驱动;standalone版免boost依赖,api与boost.asio一致;tcp客户端需管理socket/缓冲区生命周期,服务器用session封装连接,协程需c++20支持且返回awaitable类型。

c++如何用asio库进行异步编程_c++ boost.asio/standalone asio网络编程【实战】

用 Asio 做异步编程,核心是“不等结果、先干别的”,靠回调或协程驱动后续逻辑。Boost.Asio 和 Standalone Asio(即 asio 单头文件版)API 几乎一致,区别只在编译方式和依赖——Standalone 版无需 Boost 库,头文件包含即可用;Boost.Asio 需链接 boost_system(Windows 下还常要 ws2_32)。实战中选哪个取决于项目约束,功能上没差别。

异步 TCP 客户端:连接 + 发送 + 接收

典型流程:创建 socket → 异步 connect → 成功后 async_write → 再 async_read。所有操作都传入一个可调用对象(lambda、function 或绑定函数),作为完成时的回调。

  • 确保 io_context 在整个生命周期内运行(比如用 io_context.run()io_context.run_one() 驱动)
  • socket 必须在回调执行期间保持有效(避免栈对象提前析构,建议 heap 分配或用 shared_ptr 管理)
  • 读写缓冲区不能是局部栈变量(回调可能延后执行),推荐用 std::vector<char></char>std::array<char n></char> 配合 asio::buffer()

异步 TCP 服务器:接受连接 + 处理会话

服务器模式常用“accept → 创建新 session → 继续 accept”循环。每个客户端连接应封装为独立对象(如 session 类),持有 socket、缓冲区、io_context 引用,并负责自身生命周期管理。

ApiPost接口调试与文档生成工具
ApiPost接口调试与文档生成工具

ApiPost是一个支持团队协作,支持模拟POST、GET、PUT等常见请求,并可直接生成文档的API调试、管理工具,ApiPost是后台接口开发者或前端、接口测试人员的工作必备工具。快速生成、一键导出API文档。感兴趣的朋友快来下载吧。软件说明ApiPost官方版是一款十分出色的接口调试与文档生成工具,ApiPost官方版界面美观大方,功能强劲实用,支持团队协作,支持模拟POST、GET、PUT等常见请求,是后台接口开发者或前端、接口测试人员的工作必备工具。软件特色更方便支持接口调试的同时快速生成、一键

下载
  • 监听 socket 调用 async_accept(),成功后把新 socket 移交给 session 对象
  • session 内部发起 async_read(),读到数据后处理、再发 async_write(),最后通常继续 async_read() 形成循环
  • 避免在回调里直接 delete this;推荐用 shared_from_this()(需继承 std::enable_shared_from_this<session></session>)保证对象存活

协程支持(C++20 / asio::use_awaitable)

Asio 从 1.70+ 原生支持 C++20 协程(需编译器开启 /std:c++20-std=c++20),用 co_await 替代回调,代码线性易读。

  • 函数返回类型必须是 asio::awaitable<t></t>,且在 io_context 的协程调度器中启动(如 co_spawn(io_ctx, my_handler(), asio::detached)
  • 所有异步操作改用 co_await socket.async_connect(..., asio::use_awaitable) 形式
  • 错误通过 system_error 抛出,可用 try/catch 捕获,比手动检查 error_code 更直观

常见坑与建议

异步编程容易因资源管理或执行顺序出错,以下几点高频踩坑:

  • io_context::run() 会阻塞直到无待处理任务——若只调一次就退出,后续回调不会执行;多线程可搭配 io_context::work 防止提前结束
  • 同一个 socket 不允许同时发起多个未完成的 async_read/write——必须等前一个完成回调返回后,再发下一个;否则行为未定义
  • 跨线程调用需注意线程安全:io_context 本身不是线程安全的,但可通过 post()dispatch() 把任务安全投递到其执行上下文
  • 调试时启用 Asio 日志(ASIO_ENABLE_HANDLER_TRACKING 宏)能清晰看到每个操作的触发与完成链路

基本上就这些。Standalone Asio 编译更轻量,Boost.Asio 生态更成熟;协程写法清爽但要求较新工具链;回调风格兼容性强,适合嵌入式或长期维护项目。选型看团队习惯和平台限制,底层机制是一样的。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++ session 网络编程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

2023.10.17

458

4

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

2023.10.18

835

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

361

14

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.15

464

5

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

2025.11.08

278

7

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

2026.01.05

134

7

C++ Lambda 表达式与函数式编程
C++ Lambda 表达式与函数式编程

深入讲解 C++ Lambda 表达式与函数式编程范式,涵盖 Lambda 基础语法与返回值推导、值捕获与引用捕获的区别与陷阱、初始化捕获(C++14 广义捕获)、泛型 Lambda(auto 参数)、mutable 关键字修改捕获变量、std::function 类型擦除与函数包装、std::bind 参数绑定(及其被 Lambda 替代的趋势)、Lambda 在 STL 算法(sort/transform/for_each/remo

2026.05.06

116

22

Java 函数式接口与 Lambda 进阶技巧
Java 函数式接口与 Lambda 进阶技巧

在 Java Stream 基础之上进一步深入函数式编程,涵盖 @FunctionalInterface 注解与自定义函数式接口设计、四种方法引用(静态/实例/对象/构造器)的使用场景、Lambda 中的 effectively final 变量捕获规则、函数组合(andThen/compose)与柯里化技巧、Comparator 链式比较器构建、CompletableFuture 异步函数式编排、Reactor / RxJava 响应

2026.05.08

142

28

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

2271

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程