Boost :: asio :: streambuf consume()不会清空缓冲区

时间:2018-06-12 22:44:20

标签: c++ boost

我有一个读取序列化数据的函数的实现。

唯一的问题是写入数据的缓冲区似乎没有覆盖数据。 相反,在每次函数调用之后,缓冲区会附加新数据。

我读到consume()我相信它会使它工作,但调用它不会清空缓冲区。

以下代码:

void Client::read_msg() {
    boost::asio::async_read_until(socket, stream_buf, "\n", [this](boost::system::error_code ec, std::size_t) {
        if (!ec) {
            std::istream is(&stream_buf);
            std::getline(is, read_msg_string);
            ss << read_msg_string;
            cereal::BinaryInputArchive iarchive(ss);
            iarchive(txt);
            std::cerr << txt.header << " " << txt.body;
            stream_buf.consume(stream_buf.size());
            this->read_msg();
        } else {
            socket.close();
        }
    });
}

1 个答案:

答案 0 :(得分:0)

一些想法:

  1. 使用单个getline读取二进制存档绝对是一个坏主意(您永远不会读过具有0x0a(换行)的字节。
  2. 在修改底层缓冲区/流之前关闭流/存档
  3. 在读取操作之前使用传输的大小或保留buffer_size(我认为这不重要,但它是消除的一个变量)
  4. 所以,一开始会有

    std::stringstream ss;
    ss << &stream_buf;
    {
        cereal::BinaryInputArchive iarchive(ss);
        iarchive(txt);
        std::cerr << txt.header << " " << txt.body;
    }
    

    但我认为它可能只是

    {
        std::istream is(&stream_buf);
        cereal::BinaryInputArchive iarchive(is);
        iarchive(txt);
        std::cerr << txt.header << " " << txt.body;
    }
    

    据我所知,所显示的streambuf操作已根据需要调用consume()

    如果您希望存在尾随数据,您可能不想使用它,而是关闭套接字(如果您盲目地忽略尾随数据,会话伙伴最终会对您收到的内容感到困惑)