我正在学习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个字节)
答案 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)));