使用 async_read 和 asio::transfer_exactly (非 Boost Asio)

Whi*_*ash 6 c++ boost boost-asio

我以异步方式使用非 Boost Asio。我通过网络发送数据包,其格式如下:

  • 包大小:uint64
  • 主体包:uchar *(包的大小)

因此,当我想首先接收包裹时,我使用asio::transfer_exactly助手等待包裹大小:

asio::async_read(socket, buffer, asio::transfer_exactly(sizeof(uint64_t)), handler);
Run Code Online (Sandbox Code Playgroud)

处理程序签名如下所示:

void handler(const asio::error_code& error, std::size_t bytes_transferred);
Run Code Online (Sandbox Code Playgroud)

但有时此处理程序以bytes_transferred = 0执行(错误不包含任何错误)并且缓冲区不包含必要的数据(包的大小)。之后,进一步的传输挂起。

套接字中没有其他读取操作,因此async_read正在调用独占。

这种行为的原因是什么?