【问题标题】:boost::asio how to read full buffer in right way?boost::asio 如何以正确的方式读取完整缓冲区?
【发布时间】:2015-02-13 22:26:19
【问题描述】:

我正在学习boost::asio,现在对读取完整缓冲区的正确方法感到困惑。例如,当建立连接时,我想用下一种方式读取uint32_t

std::uint32_t size;
size_t len = m_socket.read_some(buffer(&size, sizeof(std::uint32_t)));

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

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

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

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    来自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)));
    

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2018-04-03
      • 2015-04-19
      • 1970-01-01
      相关资源
      最近更新 更多