如何快速上手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),仅供参考
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2594658.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!