c++ - 执行 beast::http::async_read 操作时出现短读错误

日志:

OnWrite(): bytes_transferred=343
OnRead(): bytes_transferred=0
OnRead(): Recv: 
HTTP/1.1 200 OK
fail(): OnRead: short read

我在执行 beast::http::async_read 操作时遇到短读错误。

基本上,首先我执行 async_write 操作将数据发送到服务器。然后为了读取该数据,我正在执行 async_read 操作。

正如日志所示,在 async_read 中没有读取任何字节,导致短读错误。但我想了解为什么会发生这种情况?

在 async_read 中,

  • 使用的缓冲区:beast::flat_buffer
  • 使用的响应消息:beast::http::response,我还在 async_read 回调中清除响应消息。

回答1

如果没有看到实际代码,就很难诊断出问题。以下是一些可以帮助您了解原因并可能解决问题的一般信息。

short_read 如果没有足够的缓冲区,则不会发生,当接收到的数据不满足预期的数量时会发生。

短读是正常的,请参阅https://www.boost.org/doc/libs/1_79_0/doc/html/boost_asio/overview/core/streams.html

所以https://However,%20as%20these%20could%20result%20in%20short%20writes%20or%20reads,%20an%20application%20will%20typically%20use%20the%20following%20operations%20instead来处理预期的短读:

可以使用 receive()async_receive()send()async_send() 成员函数从连接的 TCP 套接字读取或写入数据。但是,由于这些可能会导致写入或读取时间较短,因此应用程序通常会使用以下操作:read()async_read()write()async_write()

短读取作为错误条件出现的通常位置是在 SSL 流中。 OpenSSL 生成错误条件¹为 https://www.boost.org/doc/libs/1_79_0/doc/html/boost_asio/reference/ssl__error__stream_errors.html

  • stream_truncated

    底层流在 ssl 流正常关闭之前关闭。

当对等方没有协商正确的关闭时,它自然会发生。

? SSLv2 不支持协议级关闭,因此 eof 将作为 eof 传递。

相关版本历史

以前的版本修复了与可能的短读取相关的错误:

https://www.boost.org/doc/libs/1_79_0/doc/html/boost_asio/history.html#:%7E:text=Fixed%20an%20ssl%3A%3Astream%3C%3E%20bug%20that%20may%20result%20in%20spurious%20%27short%20read%27%20errors

¹ 对于 <v1.1,通过 SSL_R_SORT_READ

也可以看看

本网站上的现有帖子,例如https://stackoverflow.com/questions/63376765/short-read-error-boost-asio-synchoronous-https-call/63412813#63412813

相似文章

最新文章