我有一个读取序列化数据的函数的实现。
唯一的问题是写入数据的缓冲区似乎没有覆盖数据。 相反,在每次函数调用之后,缓冲区会附加新数据。
我读到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();
}
});
}
答案 0 :(得分:0)
一些想法:
getline
读取二进制存档绝对是一个坏主意(您永远不会读过具有0x0a
(换行)的字节。所以,一开始会有
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()
。
如果您希望存在尾随数据,您可能不想使用它,而是关闭套接字(如果您盲目地忽略尾随数据,会话伙伴最终会对您收到的内容感到困惑)