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

如何检查Boost.Asio中async_read_some、async_write_some等异步函数的返回状态

Boost.Asio异步调用执行状态判断及completion_condition用法

异步函数返回值说明

  • 所有async_*开头的Boost.Asio异步接口本身都是void返回类型,调用时仅会将异步操作提交到关联的io_context调度队列,不会同步返回操作执行结果。
  • 异步操作的执行结果(成功/失败、传输字节数)全部通过你提到的boost::asio::placeholders::error、boost::asio::placeholders::bytes_transferred两个占位符传递给绑定的完成回调函数。
  • 仅当你调用async_*时传入的参数非法(比如空缓冲区、无效的socket对象),才会在调用阶段直接抛出异常,如果你希望捕获调用阶段的错误而不抛异常,可以选择对应接口的error_code输出参数重载,调用时传入一个boost::system::error_code对象即可拿到调用阶段的即时错误。

异步操作异常捕获实现

你现有代码的完成回调HandleRead中直接判断error参数即可覆盖所有异步操作执行阶段的异常,示例实现如下:

void ConnectionHandler::HandleRead(const boost::system::error_code& ec, std::size_t bytes_transferred) {
    if (ec) {
        // 异步读出现异常,ec中包含具体错误码,比如连接断开、超时等
        std::cout << "async_read_some执行失败: " << ec.message() << std::endl;
        // 这里可以做资源清理、重连等逻辑
        return;
    }
    // 执行成功,处理读到的bytes_transferred字节数据
    // 处理完成后可以再次调用async_read_some继续接收数据
    mSock.async_read_some(
        boost::asio::buffer(mI8Data, MAX_BUFFER_LENGTH),
        boost::bind(&ConnectionHandler::HandleRead,
            shared_from_this(), 
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred)
    );
}

completion_condition使用说明

completion_condition是boost::asio::async_read、boost::asio::async_write等自由函数的可选参数,用于自定义操作完成的判断条件,比如你要读满100字节才触发回调,就可以用它实现,简单示例如下:

// 自定义completion_condition,读满100字节或者出错就停止读操作
std::size_t read_completion(const boost::system::error_code& ec, std::size_t bytes_read) {
    if (ec) return 0; // 出错就停止
    return 100 - bytes_read; // 返回还需要读的字节数,返回0就停止
}

// 调用async_read时传入自定义完成条件
boost::asio::async_read(mSock,
    boost::asio::buffer(mI8Data, MAX_BUFFER_LENGTH),
    read_completion, // 这里传入自定义的completion_condition
    boost::bind(&ConnectionHandler::HandleRead,
        shared_from_this(), 
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred)
);

注意:async_read_some/async_write_some是socket的成员函数,不支持completion_condition参数,该参数仅适用于boost::asio命名空间下的async_read/async_write全局自由函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:36:07