日志:
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。
可以使用
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
传递。
相关版本历史
以前的版本修复了与可能的短读取相关的错误:
¹ 对于 <v1.1,通过 SSL_R_SORT_READ