尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C++ 使用asio协程搭建异步服务器的过程
协程核心定义协程是用户态轻量级执行单元能在执行中主动暂停挂起并保留上下文待条件满足后恢复执行切换开销远低于线程在你的Boost.Asio代码中协程通过co_await等待异步IO如读取客户端数据挂起时不阻塞线程IO完成后自动恢复让异步代码像同步代码一样易读。实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687#include iostream// 引入Boost.Asio协程相关头文件#includeboost/asio/co_spawn.hpp // 协程创建函数#includeboost/asio/detached.hpp // 协程分离执行标识#includeboost/asio/io_context.hpp // IO上下文事件循环#includeboost/asio/ip/tcp.hpp // TCP相关功能#includeboost/asio/signal_set.hpp // 信号处理#includeboost/asio/write.hpp // 异步写操作// 简化常用的Boost.Asio协程相关类型/函数名usingboost::asio::ip::tcp;usingboost::asio::awaitable;// 协程返回类型usingboost::asio::co_spawn;// 启动协程的函数usingboost::asio::detached;// 协程分离执行不等待完成usingboost::asio::use_awaitable;// 异步操作适配协程的等待令牌// 协程本地上下文命名空间别名用于获取当前协程的执行器namespacethis_coro boost::asio::this_coro;// 协程函数处理单个客户端的回显逻辑// 参数已连接的TCP套接字通过移动语义传递避免拷贝// 返回值awaitablevoid 表示这是一个可等待的协程任务awaitablevoidecho(tcp::socket socket){try{chardata[1024];// 数据接收缓冲区大小1024字节// 无限循环处理客户端数据直到连接断开/异常for(;;){// 异步读取客户端发送的数据协程挂起等待数据到达// co_await等待异步操作完成期间不阻塞线程// async_read_some读取任意长度的数据到缓冲区返回实际读取的字节数std::size_tn co_await socket.async_read_some(boost::asio::buffer(data), use_awaitable);// 异步将读取到的数据原样回写给客户端同样通过co_await等待写完成co_await async_write(socket, boost::asio::buffer(data, n), use_awaitable);}}catch(std::exception e){// 捕获连接断开、网络异常等错误打印异常信息std::cout 回显协程异常: e.what() std::endl;}}// 协程函数TCP服务器监听逻辑等待客户端连接awaitablevoidlistener(){// 获取当前协程绑定的执行器调度器用于后续创建接收器/套接字auto executor co_await this_coro::executor;// 创建TCP接收器绑定到指定执行器监听IPv4的10086端口tcp::acceptor acceptor(executor, { tcp::v4(), 10086 });// 无限循环等待客户端连接for(;;){// 异步等待客户端接入协程挂起有新连接时返回已连接的套接字tcp::socket socket co_await acceptor.async_accept(use_awaitable);// 启动新的协程处理该客户端的回显逻辑// detached新协程独立执行不阻塞当前监听协程// std::move转移套接字所有权到echo协程co_spawn(executor, echo(std::move(socket)), detached);}}intmain(){try{// 创建IO上下文参数1表示用1个线程运行事件循环boost::asio::io_context io_context(1);// 定义信号集监听SIGINTCtrlC和SIGTERM进程终止信号boost::asio::signal_set signals(io_context, SIGINT, SIGTERM);// 异步等待信号触发收到信号后停止IO上下文优雅退出程序signals.async_wait([](auto, auto){io_context.stop();});// 启动监听协程detached表示协程后台运行不阻塞main函数co_spawn(io_context, listener(), detached);// 运行IO上下文的事件循环处理所有异步操作和协程任务io_context.run();}catch(std::exception e){// 捕获服务器启动阶段的异常如端口被占用打印错误信息std::cout 主程序异常: e.what() std::endl;}return0;}总结协程核心特性可暂停、可恢复、用户态调度、低开销。代码中体现awaitable标记协程函数co_await实现挂起等待依托io_context完成调度。核心价值用同步写法实现异步IO避免回调嵌套提升代码可读性和并发效率。
RELATED

相关推荐

SpringBoot+Vue3学生公寓管理系统开发实践

SpringBoot+Vue3学生公寓管理系统开发实践

1. 项目概述山西大同大学学生公寓管理系统是一款基于Java SpringBootVue3MyBatis技术栈开发的前后端分离应用,采用MySQL作为数据库存储方案。这个系统主要面向高校学生公寓管理场景,实现了学生信息管理、宿舍分配、报修登记、访客管理等核心功能模块。作…

📅 2026/8/25 9:24:08
PyTorch 进阶:数据集加载、模型训练与 GPU 加速

PyTorch 进阶:数据集加载、模型训练与 GPU 加速

PyTorch 进阶:数据集加载、模型训练与 GPU 加速22.1 本章导学上一章我们掌握了张量基础、自动微分与模型构建的核心语法,已经能够搭建简单的网络结构并完成单步训练。但真实的深度学习项目远不止单步迭代,它包含数据加载、多轮训练、验证评估…

📅 2026/9/8 1:08:42
深度学习框架入门:PyTorch 基础 —— 张量、自动微分与模型构建

深度学习框架入门:PyTorch 基础 —— 张量、自动微分与模型构建

深度学习框架入门:PyTorch 基础 —— 张量、自动微分与模型构建21.1 本章导学手动推导反向传播、用 NumPy 手写小型网络,能够帮我们彻底理解深度学习的底层逻辑,但真实工程场景中,几乎不会有人从零手写所有层和求导逻辑。随着网络…

📅 2026/9/16 16:40:31
MORE NEWS

更多资讯

📰

Symfony生态中的兼容性基石:polyfill-php72在大型项目中的落地实践

Symfony生态中的兼容性基石:polyfill-php72在大型项目中的落地实践 【免费下载链接】polyfill-php72 Symfony polyfill backporting some PHP 7.2 features to lower PHP versions 项目地址: https://gitcode.com/gh_mirrors/po/polyfill-php72 polyfill-php…

📰

YouTube显示不全排查指南:从视频渲染原理到修复实战

正在追的剧看到关键剧情,画面突然缩成左上角一小块,黑边占了九成屏幕;再刷新一下,变成半边画面半边黑屏,声音和字幕都正常,就是图像不老实。这个YouTube显示不全的问题我在工作里遇到过不下十次&#xff0c…

📰

rrweb录屏数据转MP4:事件流回放与无头浏览器录制实践

简介:rrweb-to-video 面向需要长期归档网页录制内容的前端开发者,解决 rrweb 录制 JSON 数据因静态资源哈希变更或删除而无法完整回放的问题。这份 JavaScript 工具源码可将 rrweb 原始数据直接转换为视频,便于永久保存与后续查阅&#xff0c…

📰

纯CSS动态面包屑:用+选择器和伪元素实现零JS层级导航

1. 项目概述:为什么“最骚”不是噱头,而是对CSS能力边界的实战检验 “一个最骚的面包屑导航”——这个标题乍看像极了某次前端茶话会上的即兴玩笑,但如果你真把它当玩笑,那大概率会在三天后对着自己写的三套方案抓耳挠腮。我第一…

📰

代练妈妈源码部署与二开:订单状态机、支付回调与并发抢单实战

简介:代练妈妈源码.zip是一套基于PHP构建的游戏代练平台网站源码,面向PHP初级、中级开发者及网站源码分析学习者。整个压缩包共包含2717个文件,约70.86MB,涵盖738个js脚本、694个png图片、426个gif动图、258个css样式及95个php核心…

📰

Matter协议实战:从nRF52840配网到Home Assistant本地控制

简介:本资源是面向物联网开发者、嵌入式工程师及智能家居协议研究者的《智能家居Matter协议详解》PDF技术文档,聚焦Matter 1.0核心规范,系统解决跨品牌设备互操作性难题。文档完整覆盖Connected Home over IP Application Clusters&#xff0…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬