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个字节)
来自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)