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

Boost::asio::streambuf consume() doesn't empty the buffer

本文关键字:清空 缓冲区 consumption asio streambuf Boost      更新时间:2023-10-16

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

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

我读到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. 读取具有单个getline的二进制存档绝对是一个坏主意(您永远不会读取具有0x0a(换行(的字节(。
  2. 在修改基础缓冲区/流之前关闭流/存档
  3. 使用传输的大小或在读取操作之前保持buffer_size(我认为这无关紧要,但这是一个要消除的变量(

所以,首先会有

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()

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