如何检查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
相关产品推荐
相关产品推荐

