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

时间:2015-02-13 22:26:19

标签: 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)));

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

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

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

1 个答案:

答案 0 :(得分: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)));