boost :: asio如何以正确的方式读取完整缓冲区?

Aer*_*Sun 4 c++ boost boost-asio

我正在学习boost::asio并且现在混淆了读取完整缓冲区的正确方法.例如,当建立连接时,我想以下uint32_t一种方式阅读:

std::uint32_t size;
size_t len = m_socket.read_some(buffer(&size, sizeof(std::uint32_t)));
Run Code Online (Sandbox Code Playgroud)

如您所见,我设置了缓冲区大小.在其他情况下,我收到了数据的len长度read_some.

所以主要的问题是:如果我在调用时设置了所需的缓冲区长度boost::asio,uint32_t那么保证会读取所有4个字节buffer吗?

或者如果不能保证 - 我怎样才能读取完整的缓冲区?(全部4个字节)

Bar*_*rry 7

来自read_some参考:

此函数用于从流套接字读取数据.函数调用将阻塞,直到成功读取一个或多个字节的数据,或者直到发生错误.

备注:

read_some操作可能无法读取所有请求的字节数.read如果需要确保在阻止操作完成之前读取所请求的数据量,请考虑使用该函数.

所以要么你必须read_some在循环中调用read,要么只是调用,这将:

阻止,直到满足下列条件之一:

  • 提供的缓冲区已满.也就是说,传输的字节数等于缓冲区大小的总和.
  • 发生错误.

此操作是根据对流的read_some功能进行零次或多次调用来实现的.

的使用read你的情况是:

std::uint32_t size;
size_t len = read(m_socket, buffer(&size, sizeof(std::uint32_t)));
Run Code Online (Sandbox Code Playgroud)