c++如何使用Boost.Asio进行异步网络编程_c++异步IO框架Boost.Asio使用教程

Boost.Asio通过io_context管理异步I/O,使用socket进行网络通信,结合回调处理连接、读写操作,需注意对象生命周期与事件循环调度。

c++如何使用boost.asio进行异步网络编程_c++异步io框架boost.asio使用教程

Boost.Asio 是一个功能强大且广泛使用的 C++ 库,用于处理网络和异步 I/O 操作。它支持同步和异步编程模型,尤其擅长构建高性能、可扩展的网络服务。下面介绍如何使用 Boost.Asio 进行异步网络编程,涵盖基本概念、核心组件和实际代码示例。

理解 Boost.Asio 的核心概念

在开始编码前,先了解几个关键概念:

io_context:这是所有异步操作的核心调度器,负责管理事件循环和分发回调。 socket:代表网络连接,如 tcp::socket,用于发送和接收数据。 异步操作:通过回调(通常为 lambda 或函数对象)在操作完成时被调用,不阻塞主线程。 strand:用于保证多个异步操作的执行顺序,避免竞态条件。

异步编程的关键是“发起操作 → 回调通知”,而不是等待结果。

实现一个简单的异步 TCP 客户端

下面是一个使用 Boost.Asio 编写的异步 TCP 客户端示例,连接到服务器并读取响应。

立即学习“C++免费学习笔记(深入)”;

#include #include #include using boost::asio::ip::tcp;int main() {    try {        boost::asio::io_context io_context;        tcp::resolver resolver(io_context);        tcp::resolver::results_type endpoints = resolver.resolve("127.0.0.1", "8080");        tcp::socket socket(io_context);        boost::asio::async_connect(socket, endpoints,            [&](const boost::system::error_code& error, const tcp::endpoint&) {                if (!error) {                    std::cout << "Connected to servern";                    // 发起异步读取                    std::array buf;                    socket.async_read_some(boost::asio::buffer(buf),                        [&](const boost::system::error_code& read_error, size_t bytes_transferred) {                            if (!read_error) {                                std::cout.write(buf.data(), bytes_transferred);                                std::cout << "n";                            } else {                                std::cerr << "Read error: " << read_error.message() << "n";                            }                        });                } else {                    std::cerr << "Connect failed: " << error.message() << "n";                }            });        io_context.run();  // 启动事件循环    }    catch (std::exception& e) {        std::cerr << "Exception: " << e.what() << "n";    }    return 0;}

注意:async_connectasync_read_some 都是非阻塞的,真正的逻辑在 lambda 回调中处理。必须调用 io_context::run() 来启动事件循环,否则回调不会执行。

编写异步 TCP 服务器

异步服务器需要能同时处理多个客户端连接。通常做法是为每个连接创建一个会话对象。

class session : public std::enable_shared_from_this {public:    session(tcp::socket socket) : socket_(std::move(socket)) {}    void start() {        do_read();    }private:    void do_read() {        auto self(shared_from_this());        socket_.async_read_some(boost::asio::buffer(data_),            [this, self](const boost::system::error_code& error, size_t length) {                if (!error) {                    do_write(length);                }            });    }    void do_write(size_t length) {        auto self(shared_from_this());        boost::asio::async_write(socket_, boost::asio::buffer(data_, length),            [this, self](const boost::system::error_code& error, size_t /*length*/) {                if (!error) {                    do_read();  // 继续读取                }            });    }    tcp::socket socket_;    std::array data_;};class server {public:    server(boost::asio::io_context& io_context, short port)        : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) {        do_accept();    }private:    void do_accept() {        acceptor_.async_accept(            [this](const boost::system::error_code& error, tcp::socket socket) {                if (!error) {                    std::make_shared(std::move(socket))->start();                }                do_accept();  // 接受下一个连接            });    }    tcp::acceptor acceptor_;};

服务器通过 do_accept 循环接受新连接,并为每个连接创建一个 session 对象。使用 shared_from_this 确保对象生命周期在异步操作期间有效。

编译与依赖配置

Boost.Asio 大部分是头文件库,但部分功能(如协程、SSL)需要链接 Boost 系统库。

安装 Boost:可通过包管理器(如 apt、brew)或源码编译。 编译命令示例(Linux):

g++ -std=c++17 client.cpp -o client -lboost_system

如果使用 CMake,添加:

find_package(Boost REQUIRED COMPONENTS system)target_link_libraries(your_target Boost::system)

基本上就这些。掌握 Boost.Asio 的关键是理解异步模型和对象生命周期管理。只要确保回调持有必要的资源(如 socket、buffer),并正确使用 shared_ptr 延长对象生命期,就能写出稳定高效的网络程序。

以上就是c++++如何使用Boost.Asio进行异步网络编程_c++异步IO框架Boost.Asio使用教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1482975.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
c++什么是虚函数 (virtual function)_c++多态与虚函数原理说明
上一篇 2025年12月19日 06:51:07
c++如何判断map中是否存在某个key_C++检查键是否存在的安全方法
下一篇 2025年12月19日 06:51:11

相关推荐

  • 如何在Linux中自动重启 Linux systemd自动恢复

    答案:通过配置systemd服务文件中的Restart、RestartSec、WatchdogSec及StartLimitInterval等参数,可实现Linux服务的自动重启与看门狗监控,并避免无限重启循环,提升系统稳定性。 在Linux中,可以通过systemd来实现服务的自动重启,确保服务在崩…

    2026年9月20日
    000
  • JAXB中动态获取Java对象QName并创建JAXBElement的反射策略

    本文探讨了在jaxb中,当`jaxbintrospector.getelementname`无法获取java对象对应的`qname`时,如何通过反射机制调用`objectfactory`中生成的`create`方法来动态创建`jaxbelement`。该方法避免了大量类型判断,提高了代码的灵活性和可…

    2026年9月20日
    000
  • 电脑开机要按F1因BIOS设置错误通过恢复默认设置解决

    开机需按F1主因是BIOS检测到配置错误或硬件信息丢失,常见于CMOS电池没电、硬盘模式设置错误等;恢复默认设置可解决多数问题。 电脑开机提示按F1才能进入系统,多数情况是BIOS设置异常导致的。最常见的原因是CMOS电池没电、硬盘模式设置错误、软驱或启动设备配置问题等。这类问题通常可以通过恢复BI…

    2026年9月20日
    100
  • 428万行业最强跑分!荣耀高管:Magic8同是骁龙 大有不同

    10月16日消息,昨晚荣耀magic8系列正式亮相,全系搭载第五代骁龙8至尊版处理器,这款芯片目前处于行业性能巅峰地位。 该处理器采用台积电第三代3nm工艺打造,在相同性能下功耗降低10%。其CPU架构为2+6的八核设计,其中超大核主频高达4.6GHz,创下移动平台新纪录,大核频率则为3.62GHz…

    2026年9月20日
    100
  • Mockito中利用自定义ArgumentMatcher实现集合内参数匹配

    mockito并未提供直接的`in()`参数匹配器来判断方法参数是否包含在指定集合中。本文将详细介绍如何利用`intthat`(或`argthat`)结合lambda表达式或自定义匹配器,灵活实现对方法参数是否属于某个集合的条件匹配,从而在测试存根(stubbing)或验证(verification…

    2026年9月20日
    000
  • mysql如何优化初级项目数据库性能

    答案:初级项目数据库性能问题多源于设计和使用不当,优化需从表结构、索引、SQL语句和配置入手。应选用合适数据类型、避免NULL、拆分大字段;为常用查询字段建索引,遵循最左前缀原则,避免函数操作导致索引失效;禁止SELECT *,合理使用LIMIT,减少子查询与循环中执行SQL;开启慢查询日志,使用连…

    2026年9月20日
    000
  • safari浏览器怎么设置默认搜索引擎为谷歌_safari浏览器默认搜索引擎设置方法

    首先在iPhone的“设置”中进入“Safari浏览器”,选择“搜索引擎”并设为Google;Mac用户可在Safari地址栏点击放大镜图标后选择Google。 如果您在使用Safari浏览器时发现默认搜索引擎并非您习惯使用的谷歌,可能会导致搜索结果不符合预期或访问受限。以下是将Safari浏览器默…

    2026年9月20日
    000
  • Linux如何解决rpm依赖关系错误

    Linux如何解决rpm依赖关系错误Linux如何解决rpm依赖关系错误Linux如何解决rpm依赖关系错误Linux如何解决rpm依赖关系错误

    使用YUM可自动解决RPM依赖,通过yum localinstall安装本地包或yum install自动处理依赖;2. 较新系统推荐使用DNF,命令为dnf install 包名.rpm,依赖解析更高效;3. 无法使用YUM/DNF时可手动处理,通过rpm -ivh查看缺失依赖,再下载并按序安装;…

    2026年9月20日 用户投稿
    000
  • Java中将包含嵌套列表的对象列表扁平化为单一元素列表的转换技巧

    本文探讨了在java中如何将一个包含嵌套列表的对象列表进行转换,使其生成一个新的列表,其中每个对象内部的嵌套列表只包含一个元素。文章详细介绍了三种实现方式:基于java 7及以前版本的传统循环方法、利用java 8至java 15的stream api结合`flatmap`操作,以及java 16及…

    2026年9月20日
    200
  • VSCode怎么查看NPM版本_VSCode NPM版本查询教程

    在VSCode中查看NPM版本,需打开集成终端并输入npm -v或npm –version。1. 使用快捷键Ctrl + (Windows/Linux)或Cmd + (macOS)打开终端;2. 输入命令npm -v执行;3. 终端将显示当前NPM版本号,如8.19.2。该方法可快速验证…

    2026年9月20日
    000
  • 如何为VSCode配置C++开发环境?

    答案:配置VSCode的C++环境需安装MinGW-w64编译器并添加到PATH,安装C/C++和可选Code Runner扩展,创建.c_cpp_properties.json、tasks.json和launch.json文件以配置编译器路径、编译任务和调试设置,最后通过编译运行测试代码验证配置成…

    2026年9月20日
    100
  • LINUX怎么修改用户密码_Linux修改或重置用户密码的命令

    使用passwd命令可修改用户密码,root可通过sudo passwd用户名重置他人密码,配合-e参数可强制用户下次登录改密,结合chpasswd可实现非交互式批量设密。 在Linux系统中,修改或重置用户密码是一个常见的系统管理操作。无论是普通用户修改自己的密码,还是管理员为其他用户重置密码,都…

    2026年9月20日
    200
  • MySQL索引是什么_如何通过索引提升查询性能?

    MySQL索引是什么_如何通过索引提升查询性能?MySQL索引是什么_如何通过索引提升查询性能?MySQL索引是什么_如何通过索引提升查询性能?MySQL索引是什么_如何通过索引提升查询性能?

    索引通过排序+查找结构提升查询速度,适合加索引的字段包括where条件、join连接、order by和group by中的字段,但唯一值少、数据量小或频繁更新的字段不适合。常见误区有索引失效、模糊查询左侧通配符、联合索引顺序错误、冗余索引等。可通过explain命令查看索引使用情况,定期清理无用索…

    2026年9月20日 用户投稿
    000
  • Mockito ArgumentMatcher:优雅实现参数集合包含性验证

    本文探讨了在mockito中,当需要验证方法参数是否包含在特定集合中时,如何克服标准`argumentmatchers`的限制。通过利用`argumentmatchers.intthat()`(或`argthat()`)结合lambda表达式,可以灵活地实现自定义的参数匹配逻辑。文章还介绍了如何将此…

    2026年9月20日
    000
  • Linux怎么删除用户的某个附属组

    Linux怎么删除用户的某个附属组Linux怎么删除用户的某个附属组Linux怎么删除用户的某个附属组Linux怎么删除用户的某个附属组

    删除Linux用户附属组需先用gpasswd -d移除用户,再用usermod -G更新组列表,确保组定义与用户权限一致,避免权限不一致风险。 删除Linux用户某个附属组,其实就是修改用户所属的组列表。关键在于理解Linux用户组的概念以及如何安全地修改用户账户信息。 解决方案 使用 gpassw…

    2026年9月20日 用户投稿
    000
  • 生产环境错误监控与告警设置

    在生产环境中设置错误监控与告警的步骤包括:1. 使用sentry等工具捕获并记录错误;2. 配置告警规则,根据业务需求定制阈值;3. 选择合适的告警接收方式,如邮件或slack;4. 对错误进行分类和优先级排序,平衡监控精细度与系统性能;5. 注意错误分类、告警疲劳、测试告警和数据隐私等问题,以提升…

    2026年9月20日
    000
  • 网络存储系统中SMB与NFS协议在传输效率上的差异对比

    SMB与NFS性能差异主要取决于应用场景:SMB适用于Windows环境和权限精细管理,NFS更适合Linux集群和高性能计算;在小文件操作中NFS快10%-30%,大文件传输两者吞吐接近,NFS在虚拟化场景IOPS高15%-20%,SMB在混合读写与AD集成下更优;建议使用SMB 3+/NFSv4…

    2026年9月20日
    000
  • 绝境北方兑换码有什么 绝境北方最新2025兑换码分享

    绝境北方最新通用兑换码有:north888、viking2025、ship666等等,可在游戏内商城直接兑换,获得黄金龙头船首像、1000铁与建造速度+15%等丰厚奖励,限时有效先到先得,也可在修改器中享受更多福利。 享受无限物品|游戏作弊器: 绝境北方最新2025兑换码如下: NORTH888:兑…

    2026年9月20日
    500
  • Java中通过PKCS12证书实现OkHttp客户端认证的POST请求

    本教程详细介绍了如何在java应用中,利用okhttp库执行需要客户端证书认证的post请求。我们将重点讲解如何加载pkcs12格式的证书文件,配置keystore和keymanagerfactory,初始化sslcontext,并将其集成到okhttpclient中,以确保请求的安全性和认证的正确…

    2026年9月20日
    000
  • 在Workerman中使用Composer依赖库

    在workerman中可以使用composer依赖库来扩展应用功能,但需要考虑异步编程特性。1. 创建composer.json文件并指定所需库,如monolog。2. 运行composer install命令安装库。3. 在worker进程中初始化和使用库,如monolog记录日志。4. 评估库的…

    2026年9月20日
    000

发表回复

登录后才能评论
关注微信