boost asio ssl::stream<tcp::socket> 是不是支持多个挂起的 http::async_write 调用?

Posted

技术标签:

【中文标题】boost asio ssl::stream<tcp::socket> 是不是支持多个挂起的 http::async_write 调用?【英文标题】:Does boost asio ssl::stream<tcp::socket> supports multiple pending http::async_write calls?boost asio ssl::stream<tcp::socket> 是否支持多个挂起的 http::async_write 调用? 【发布时间】:2020-03-29 18:14:19 【问题描述】:

我有一个 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 序列化)。

【问题讨论】:

【参考方案1】:

根据Beast documentation async_write:

此操作通过对流的 async_write_some 函数的零次或多次调用来实现,称为组合操作。程序必须确保在此操作完成之前,流不会执行其他写入操作。

【讨论】:

以上是关于boost asio ssl::stream<tcp::socket> 是不是支持多个挂起的 http::async_write 调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅地关闭 boost asio ssl 客户端?

boost::asio::async_write 写入 ssl::stream 成功但服务器未获取

在 Boost.Asio 中同时使用 SSL 套接字和非 SSL 套接字?

在使用Boost :: asio之前从套接字读取之后是否可以执行async_handshake?

boost::asio::ssl::context 可以在多个 SSL 流之间共享吗?

boost asio ssl async_shutdown 总是以错误结束?