当前位置: 首页 > article >正文

如何快速上手Asio:10个简单示例带你掌握C++网络编程

如何快速上手Asio10个简单示例带你掌握C网络编程【免费下载链接】asioAsio C Library项目地址: https://gitcode.com/gh_mirrors/as/asioAsio是一个功能强大的C库专为网络和底层I/O编程设计提供了异步操作模型帮助开发者构建高效的网络应用程序。无论是开发客户端还是服务器Asio都能简化复杂的网络编程任务让你专注于业务逻辑而非底层细节。 Asio核心概念解析Asio的核心在于其异步操作模型理解这一模型是掌握Asio的关键。异步操作由三个主要部分组成图1Asio异步操作模型展示了发起函数、异步操作和完成处理程序之间的关系异步操作的两个阶段Asio的异步操作分为两个明确的阶段确保资源管理和操作执行的安全性图2Asio异步操作的两个阶段展示了从操作开始到完成的完整生命周期阶段1异步操作处于挂起状态此时资源被安全管理阶段2异步操作完成外部可见的副作用完全确立完成处理程序被排队执行Proactor设计模式Asio基于Proactor设计模式这是一种高效的异步I/O模型图3Asio Proactor模式架构展示了事件多路分解器和异步操作处理器的协作方式Proactor模式的核心组件包括事件多路分解器Asynchronous Event Demultiplexer异步操作处理器Asynchronous Operation Processor完成事件队列Completion Event Queue完成处理程序Completion Handler 环境准备与安装1. 获取Asio源码git clone https://gitcode.com/gh_mirrors/as/asio2. 编译与安装Asio是一个头文件库大多数情况下不需要编译成库文件。你只需在项目中包含Asio的头文件即可#include asio.hpp对于需要链接的组件如SSL支持可参考源码目录中的Makefile.am进行编译。 10个实用Asio示例示例1简单的定时器#include asio.hpp #include iostream int main() { asio::io_context io; asio::steady_timer t(io, asio::chrono::seconds(5)); t.wait(); std::cout Hello, Asio! std::endl; return 0; }这个简单示例展示了Asio最基本的用法使用steady_timer创建一个5秒的定时器。示例2异步定时器#include asio.hpp #include iostream void print(const asio::error_code /*e*/) { std::cout Hello, Asio! std::endl; } int main() { asio::io_context io; asio::steady_timer t(io, asio::chrono::seconds(5)); t.async_wait(print); io.run(); return 0; }此示例展示了Asio的异步编程模型使用async_wait注册一个回调函数当定时器到期时执行。示例3TCP服务器创建一个简单的TCP服务器接受客户端连接并返回Hello, World!#include asio.hpp #include iostream #include string using asio::ip::tcp; void handle_write(const asio::error_code /*error*/, size_t /*bytes_transferred*/) {} void handle_accept(const asio::error_code error, tcp::socket socket) { if (!error) { std::string message Hello, World!; asio::async_write(socket, asio::buffer(message), handle_write); } } int main() { try { asio::io_context io_context; tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 12345)); acceptor.async_accept( { handle_accept(ec, std::move(socket)); }); io_context.run(); } catch (std::exception e) { std::cerr e.what() std::endl; } return 0; }示例4TCP客户端与上述服务器配套的TCP客户端#include asio.hpp #include iostream #include array using asio::ip::tcp; int main() { try { asio::io_context io_context; tcp::resolver resolver(io_context); tcp::resolver::results_type endpoints resolver.resolve(localhost, 12345); tcp::socket socket(io_context); asio::connect(socket, endpoints); std::arraychar, 128 buf; asio::error_code error; size_t len socket.read_some(asio::buffer(buf), error); if (error asio::error::eof) std::cout Connection closed cleanly std::endl; else if (error) throw asio::system_error(error); std::cout.write(buf.data(), len); } catch (std::exception e) { std::cerr e.what() std::endl; } return 0; }示例5UDP回声服务器#include asio.hpp #include iostream using asio::ip::udp; int main() { try { asio::io_context io_context; udp::socket socket(io_context, udp::endpoint(udp::v4(), 12345)); for (;;) { std::arraychar, 1 recv_buf; udp::endpoint remote_endpoint; socket.receive_from(asio::buffer(recv_buf), remote_endpoint); std::string message Hello, UDP!; socket.send_to(asio::buffer(message), remote_endpoint); } } catch (std::exception e) { std::cerr e.what() std::endl; } return 0; }示例6使用协程的异步操作C20#include asio.hpp #include asio/co_spawn.hpp #include asio/detached.hpp #include iostream using asio::ip::tcp; asio::awaitablevoid session(tcp::socket socket) { try { char data[1024]; for (;;) { size_t n co_await socket.async_read_some(asio::buffer(data), asio::use_awaitable); co_await asio::async_write(socket, asio::buffer(data, n), asio::use_awaitable); } } catch (std::exception e) { std::cerr Exception: e.what() std::endl; } } asio::awaitablevoid listener() { auto executor co_await asio::this_coro::executor; tcp::acceptor acceptor(executor, tcp::endpoint(tcp::v4(), 12345)); for (;;) { tcp::socket socket co_await acceptor.async_accept(asio::use_awaitable); asio::co_spawn(executor, session(std::move(socket)), asio::detached); } } int main() { try { asio::io_context io_context(1); asio::co_spawn(io_context, listener(), asio::detached); io_context.run(); } catch (std::exception e) { std::cerr Exception: e.what() std::endl; } return 0; }示例7HTTP客户端#include asio.hpp #include iostream #include string using asio::ip::tcp; int main() { try { asio::io_context io_context; tcp::resolver resolver(io_context); tcp::resolver::results_type endpoints resolver.resolve(example.com, http); tcp::socket socket(io_context); asio::connect(socket, endpoints); std::string request GET / HTTP/1.1\r\n Host: example.com\r\n Connection: close\r\n\r\n; asio::write(socket, asio::buffer(request)); asio::streambuf response; asio::read_until(socket, response, \r\n); std::istream response_stream(response); std::string http_version; response_stream http_version; unsigned int status_code; response_stream status_code; std::string status_message; std::getline(response_stream, status_message); std::getline(response_stream, status_message); while (std::getline(response_stream, status_message)) { if (status_message \r) break; } std::stringstream ss; ss response; std::cout ss.str() std::endl; } catch (std::exception e) { std::cerr e.what() std::endl; } return 0; }示例8使用SSL的安全连接#include asio.hpp #include asio/ssl.hpp #include iostream #include string using asio::ip::tcp; namespace ssl asio::ssl; using ssl_socket ssl::streamtcp::socket; int main() { try { asio::io_context io_context; ssl::context ctx(ssl::context::sslv23); ctx.set_default_verify_paths(); ssl_socket socket(io_context, ctx); socket.set_verify_mode(ssl::verify_peer); tcp::resolver resolver(io_context); asio::connect(socket.lowest_layer(), resolver.resolve(example.com, https)); socket.handshake(ssl_socket::client); std::string request GET / HTTP/1.1\r\n Host: example.com\r\n Connection: close\r\n\r\n; asio::write(socket, asio::buffer(request)); asio::streambuf response; asio::read_until(socket, response, \r\n); std::istream response_stream(response); std::string http_version; response_stream http_version; unsigned int status_code; response_stream status_code; std::string status_message; std::getline(response_stream, status_message); std::cout Response status: status_code std::endl; } catch (std::exception e) { std::cerr Exception: e.what() std::endl; } return 0; }示例9定时器链#include asio.hpp #include iostream void print1(const asio::error_code /*e*/, asio::steady_timer* t, int* count) { if (*count 5) { std::cout *count std::endl; (*count); t-expires_at(t-expiry() asio::chrono::seconds(1)); t-async_wait(std::bind(print1, asio::placeholders::error, t, count)); } } int main() { asio::io_context io; int count 0; asio::steady_timer t(io, asio::chrono::seconds(1)); t.async_wait(std::bind(print1, asio::placeholders::error, t, count)); io.run(); std::cout Final count is count std::endl; return 0; }示例10信号处理#include asio.hpp #include iostream void handle_signal(const asio::error_code /*error*/, int signal_number) { std::cout Received signal: signal_number std::endl; } int main() { asio::io_context io_context; asio::signal_set signals(io_context, SIGINT, SIGTERM); signals.async_wait(handle_signal); std::cout Waiting for signals (press CtrlC to exit)... std::endl; io_context.run(); return 0; } 深入学习资源Asio库提供了丰富的文档和示例帮助你进一步掌握网络编程官方文档位于src/doc/目录下包含完整的参考手册和教程示例代码src/examples/目录提供了各种C版本的示例程序测试用例src/tests/目录包含大量测试代码展示了Asio的各种功能 常见问题解决链接错误如果遇到链接错误确保在编译时链接了必要的库g your_program.cpp -o your_program -lpthread对于SSL功能还需要链接OpenSSL库g your_ssl_program.cpp -o your_ssl_program -lpthread -lssl -lcrypto异步操作不执行确保调用了io_context::run()这是Asio事件循环的入口点。C版本要求Asio支持C11及以上标准部分高级功能如协程需要C20或更高版本。 总结Asio是一个强大而灵活的C网络编程库通过异步操作模型简化了复杂的网络编程任务。本文介绍的10个示例涵盖了从简单定时器到安全SSL连接的各种常见用例帮助你快速上手Asio开发。无论是构建高性能服务器、跨平台客户端还是实现复杂的网络协议Asio都能提供坚实的基础和优雅的API让你的网络编程之旅更加顺畅。继续探索Asio的世界你将发现更多强大的功能和编程模式为你的C项目增添强大的网络能力【免费下载链接】asioAsio C Library项目地址: https://gitcode.com/gh_mirrors/as/asio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关文章:

如何快速上手Asio:10个简单示例带你掌握C++网络编程

如何快速上手Asio:10个简单示例带你掌握C网络编程 【免费下载链接】asio Asio C Library 项目地址: https://gitcode.com/gh_mirrors/as/asio Asio是一个功能强大的C库,专为网络和底层I/O编程设计,提供了异步操作模型,帮助…...

3分钟快速上手:免费百度网盘解析工具的完整使用指南

3分钟快速上手:免费百度网盘解析工具的完整使用指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾因百度网盘下载速度缓慢而感到困扰?baidu-…...

保姆级教程:用RaiDrive把阿里云盘挂载成Windows本地硬盘(附最新Token获取方法)

阿里云盘变本地硬盘:RaiDrive全流程配置与高阶玩法指南 你是否经常需要在不同设备间频繁切换阿里云盘客户端?或是苦恼于大文件必须下载才能编辑的繁琐操作?将阿里云盘挂载为Windows本地硬盘,可能是解决这些痛点的最佳方案。想象一…...

支付差异单怎么设计才方便追查?少单、差额、状态不一致分类一次讲透

支付差异单怎么设计才方便追查?少单、差额、状态不一致分类一次讲透 这篇直接按支付差异单来拆,不只讲“有差异就报警”,而是把差异分类、责任归因、处理状态和审计讲具体。 目标是你看完后,能把差异单从一条异常记录,…...

vscode-dark-islands主题下的Elixir开发:模块与函数色彩区分

vscode-dark-islands主题下的Elixir开发:模块与函数色彩区分 【免费下载链接】vscode-dark-islands VSCode theme based off the easemate IDE and Jetbrains islands theme 项目地址: https://gitcode.com/GitHub_Trending/vs/vscode-dark-islands vscode-d…...

HarmonyOS 6 ArkUI 属性动画(.animation)使用文档

文章目录属性动画(.animation)核心1. 动画定义2. 适用场景3. 核心配置项代码逐模块解析1 状态变量定义2 动画 1:宽高尺寸动画(change size)3 动画 2:旋转角度动画(change rotate angle&#xff…...

内存注入技术突破:实现《原神》帧率限制的动态解除方案

内存注入技术突破:实现《原神》帧率限制的动态解除方案 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 核心关键词:内存注入技术、WriteProcessMemory、动态帧率解…...

终极字体美化指南:5分钟让Windows文字显示效果媲美Mac!

终极字体美化指南:5分钟让Windows文字显示效果媲美Mac! 【免费下载链接】mactype Better font rendering for Windows. 项目地址: https://gitcode.com/gh_mirrors/ma/mactype 还在为Windows系统上模糊不清的字体而烦恼吗?MacType是一…...

在个人服务器部署私有AI助手:基于Llama与Ollama的本地大模型实践

1. 项目概述:当开源大模型遇上个人服务器最近在折腾个人服务器的时候,发现了一个非常有意思的项目,叫getumbrel/llama-gpt。简单来说,它就是一个让你能在自己的硬件上,比如树莓派、NAS或者一台闲置的旧电脑&#xff0c…...

WarcraftHelper:魔兽争霸3终极优化神器,让经典游戏焕发新生

WarcraftHelper:魔兽争霸3终极优化神器,让经典游戏焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸3…...

磁场定向控制(FOC)硬件平台:STM32G431RBT6的无刷电机驱动支持

STM32G431RBT6:170MHz Cortex-M4工业MCU的技术解析在工业控制、电机驱动和数字电源等领域,微控制器需要在处理性能、模拟集成度和实时响应之间取得平衡。STM32G431RBT6是意法半导体推出的基于ARM Cortex-M4内核的主流型MCU,凭借170MHz主频、数…...

ydotool与xdotool对比分析:为什么选择uinput框架更强大

ydotool与xdotool对比分析:为什么选择uinput框架更强大 【免费下载链接】ydotool Generic command-line automation tool 项目地址: https://gitcode.com/gh_mirrors/yd/ydotool 在Linux自动化工具领域,ydotool作为新一代命令行自动化工具&#x…...

别再手动维护Excel了!用PingCode搭建需求跟踪矩阵(RTM)的保姆级教程

从Excel到专业工具:用PingCode构建需求跟踪矩阵的实战指南 在软件开发和测试领域,需求跟踪矩阵(RTM)是确保产品质量的重要工具。随着项目规模扩大和团队协作复杂度提升,传统Excel表格已经难以满足现代敏捷开发的需求。…...

如何为Nintendo Switch解锁自定义功能?大气层系统完整指南

如何为Nintendo Switch解锁自定义功能?大气层系统完整指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 你是否希望为你的Nintendo Switch解锁更多可能性?大气层系…...

利用PowerDC Powertree功能,5分钟搞定多路电源系统的仿真设置

5分钟高效配置:PowerDC Powertree在多路电源系统仿真中的实战技巧 当一块主板同时承载着CPU核心供电、内存电压调节和高速IO电源网络时,传统仿真设置往往需要工程师逐一手动配置每个VRM模块和负载点——这个过程可能消耗数小时。而PowerDC的Powertree功能…...

网盘文件下载新革命:告别限速,九大平台直链一键获取

网盘文件下载新革命:告别限速,九大平台直链一键获取 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云…...

Beyond Compare 5密钥生成完全指南:3种方法快速解决评估错误

Beyond Compare 5密钥生成完全指南:3种方法快速解决评估错误 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 如果您正在使用Beyond Compare 5进行文件对比工作,30天评估期…...

ModOrganizer2:游戏模组管理的终极解决方案 - 从新手到专家的完整指南

ModOrganizer2:游戏模组管理的终极解决方案 - 从新手到专家的完整指南 【免费下载链接】modorganizer Mod manager for various PC games. Discord Server: https://discord.gg/ewUVAqyrQX if you would like to be more involved 项目地址: https://gitcode.com…...

Diablo Edit2终极指南:5个简单步骤掌握暗黑破坏神II角色编辑器

Diablo Edit2终极指南:5个简单步骤掌握暗黑破坏神II角色编辑器 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit Diablo Edit2是一款功能强大的暗黑破坏神II角色存档编辑器,专…...

SD-PPP:Photoshop AI插件终极指南 - 5分钟开启AI创作新时代

SD-PPP:Photoshop AI插件终极指南 - 5分钟开启AI创作新时代 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 还在为Photoshop中缺乏AI功能而烦恼吗?SD-PPP这款革命性的免费Photoshop AI插件将…...

MacBook Touch Bar Windows驱动:解锁苹果触控条在Windows系统的完整潜力

MacBook Touch Bar Windows驱动:解锁苹果触控条在Windows系统的完整潜力 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm 当MacBook Pro用户在Windows系…...

告别两个电源模块!用TI UCD3138+四开关Buck-Boost,一个电路搞定电池充放电(附原理图分析)

四开关Buck-Boost双向DC/DC变换器在储能系统中的集成设计 户外电源设备正朝着高集成度与低成本方向快速演进。传统方案中,充电与放电电路往往需要两套独立的功率模块,这不仅增加了30%以上的BOM成本,还使得PCB布局复杂度成倍提升。而采用TI UC…...

终极指南:如何利用ChatPaper快速生成专业论文方法部分

终极指南:如何利用ChatPaper快速生成专业论文方法部分 【免费下载链接】ChatPaper Use ChatGPT to summarize the arXiv papers. 全流程加速科研,利用chatgpt进行论文全文总结专业翻译润色审稿审稿回复 项目地址: https://gitcode.com/gh_mirrors/ch/C…...

DeepTutor:基于智能体原生的个性化AI学习伴侣架构与实践

1. 项目概述:一个面向未来的智能学习伴侣如果你正在寻找一个能真正理解你学习节奏、能陪你从入门到精通的“AI导师”,而不仅仅是另一个聊天机器人,那么DeepTutor的出现,可能正是你期待已久的答案。这不是一个简单的问答工具&#…...

野火拂晓开发板用CMSIS-DAP下载失败?别急着换DLL,试试KEIL里这个隐藏选项

野火拂晓开发板CMSIS-DAP下载失败?KEIL隐藏选项的终极解决方案 当你在使用野火拂晓开发板配合CMSIS-DAP调试器进行程序下载时,是否遇到过这样的场景:按照常规流程添加了Flash算法,选择了正确的下载器,甚至尝试了网上各…...

FPGA数字滤波器实现:并行处理与VHDL优化

1. FPGA数字滤波器实现概述在嵌入式系统设计中,数字信号处理(DSP)功能实现通常面临两种选择:使用专用DSP处理器或采用可编程逻辑器件(PLD)。作为一名长期从事FPGA开发的工程师,我亲身体验到FPGA…...

Openaibot框架:模块化设计打造可定制AI聊天机器人

1. 项目概述:一个能帮你“驯服”AI的聊天机器人框架如果你正在寻找一个能让你轻松接入各种大语言模型(LLM),并快速构建出功能强大、可定制化聊天机器人的开源项目,那么LlmKira/Openaibot绝对值得你花时间深入研究。这不…...

ROS手柄控制避坑指南:从`/joy`话题数据到`Twist`消息的完整调试流程

ROS手柄控制避坑指南:从/joy话题数据到Twist消息的完整调试流程 当你在ROS环境中尝试用手柄控制机器人或仿真对象时,是否遇到过乌龟纹丝不动、运动方向错乱,或者速度异常的情况?这些问题往往源于手柄数据与运动指令之间的映射关系…...

如何通过反向面试考察公司盈利与增长策略:终极指南

如何通过反向面试考察公司盈利与增长策略:终极指南 【免费下载链接】reverse-interview-zh 技术面试最后反问面试官的话 项目地址: https://gitcode.com/gh_mirrors/re/reverse-interview-zh 在求职过程中,技术面试往往被视为单向考核&#xff0c…...

互联网大厂 Java 求职面试:从音视频场景到微服务的旅程

互联网大厂 Java 求职面试:从音视频场景到微服务的旅程 在一次真实的面试中,严肃的面试官和搞笑的水货程序员燕双非展开了一场技术比拼。以下是他们之间的对话,展示了在互联网大厂求职的真实场景。 第一轮:音视频场景 面试官&a…...