You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Boost::asio异步调用异常问题排查求助

DummyNetwork_Basic 测试失败:端口3000无法向3001发送消息(未连接)

问题核心

运行DummyNetwork_Basic测试时,DummyNetwork3000向3001端口发送消息失败,报错提示未建立连接,大概率是boost::asio::io_service的使用逻辑存在问题,比如异步任务未正确投递、io_service未被正确驱动执行。

排查与修复要点

  • 检查io_service的线程驱动
    如果只初始化了io_service但没启动线程调用run()/run_one(),所有异步操作(包括连接建立、消息发送)都会卡在队列里,根本不会执行,自然连不上。
    错误示例:

    boost::asio::io_service io;
    // 只创建了socket和endpoint,没启动io的执行线程
    

    修复:至少启动一个线程来跑io_service:

    std::thread io_thread([&io](){ io.run(); });
    // 程序退出前别忘了join线程,避免资源泄漏
    io_thread.join();
    
  • 验证异步任务的投递有效性
    重点检查async_connect这类异步操作是否真的被投递到io_service队列:

    • 确认回调函数没有语法错误,导致任务没被调度;
    • 排查是否有提前调用io.stop()的情况,一旦io_service停止,后续所有任务都不会执行。
  • 连接状态的同步判断
    别在连接建立完成前就调用发送接口——如果async_connect的回调还没触发,连接其实没建立,发送肯定失败。要么在连接成功的回调里触发发送,要么用原子变量标记连接状态:

    std::atomic<bool> is_connected{false};
    
    void on_connect(const boost::system::error_code& ec) {
      if (!ec) {
        is_connected.store(true);
        // 连接成了再发消息
        send_msg();
      }
    }
    
    // 发送前先判断状态
    if (is_connected.load()) {
      send_msg();
    }
    
  • 确认服务端(3001端口)的启动逻辑
    客户端连不上,也要排查服务端:3001端口的服务端必须完成listen()和async_accept(),并且它的io_service线程要正常运行,否则客户端的连接请求会直接失败。

内容的提问来源于stack exchange,提问作者Colby Anderson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:42:42