c++ - 是否提升 asio ssl::stream支持多个挂起的 http::async_write 调用?
问题描述
我有一个 http 客户端执行 http::async_write() 并带有一个在 ssl::stream 上执行 http::async_read() 的回调。所有异步操作都包装在同一个显式链中。
简化的代码如下所示
http::async_write(
*tcp_session_->tcp_stream(), *request,
boost::asio::bind_executor(
tcp_session_strand_,
[request, this](
boost::system::error_code ec,
std::size_t /* bytes_transferred */) {
if (ec) {
return;
}
auto response_buffer =
std::make_shared<boost::beast::flat_buffer>();
auto response = std::make_shared<HttpResponse>();
http::async_read(
*tcp_session_->tcp_stream(), *response_buffer, *response,
boost::asio::bind_executor(
tcp_session_strand_,
[request, done, response_buffer, response](
boost::system::error_code ec,
std::size_t /*bytes_transferred*/) {
if (ec) {
// log error
return;
}
}));
}));
我连续两次这样调用 async_write 。在执行第二次写入之前,我不会等待第一个 async_write 处理程序完成。
我看到的行为是。第一个 async_write 完成,然后第二个 async_write 完成,然后调用第一个 async_read 并出现错误:“操作已取消”。这重现非常一致,所以我假设 ssl::stream 不支持多个挂起的 http 请求。基本上,在发送下一个请求之前必须等待响应。
我的假设正确吗?我阅读了 ssl::stream 的文档,但它没有说明任何内容(只有异步操作必须由 strand 序列化)。
解决方案
根据Async_write 的Beast 文档:
此操作通过对流的 async_write_some 函数的零次或多次调用来实现,称为组合操作。程序必须确保该流在此操作完成之前不执行其他写入。
推荐阅读
- javascript - 当值为 false 时删除数组中的确切对象
- python - Python 2.7 上的假日应用程序
- java - 在 Java VM 选项中覆盖默认 user.home 时查找它
- javascript - 如何将此原型函数转换为 es6?
- jenkins - 在推送到特定目录时触发特定作业
- android - android - onRequestPermissionsResult - 不覆盖或实现超类型的方法
- r - R 3.5 中的 state.center 包
- typescript - tsconfig 参考似乎不适用于 VS2017 15.7.1 中的多个项目
- xamarin - 将 Android MainActivity.cs 中的短文本数据绑定/设置到共享的 Xamarin 表单标签?
- subquery - 子查询中的左连接