我有一个读取序列化数据的函数的以下实现。
唯一的问题是写入数据的缓冲区似乎不会覆盖数据。 相反,在每次函数调用之后,缓冲区会附加新数据。
我读到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();
}
});
}
一些想法:
- 读取具有单个
getline
的二进制存档绝对是一个坏主意(您永远不会读取具有0x0a
(换行(的字节(。 - 在修改基础缓冲区/流之前关闭流/存档
- 使用传输的大小或在读取操作之前保持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()
。
如果您期望存在尾随数据,您可能不想使用它,而是关闭套接字(如果您盲目忽略尾随数据,对话伙伴最终会对您收到的内容感到困惑(