Есть ли способ читать из streambuf без удаления байтов?Как читать с Boost ASIO streambuf?
Я читаю поле «размер сообщения» из буфера, чтобы проверить, получено ли все сообщение.
Если нет, я отправляю еще одну асинхронную запись, чтобы получить ее, но обработчик тогда не знает, как долго должно быть сообщение, потому что поле размера было удалено.
Любая помощь оценена!
E.g.
boost::asio::streambuf _buffer;
void onReceive(const boost::system::error_code& e, std::size_t bytesTransferred)
{
if(e) return;
if(_buffer.size() > 0)
{
// Partial message was previously received, but I don't know how long.
}
else
{
_buffer.commit(bytesTransferred);
/* Read the size (and remove it from the stream) */
unsigned short size = 0;
std::istream in(&_buffer);
in.read((char*)&size, sizeof(unsigned short);
/* Got the whole message? */
if(_buffer.size() > size)
{
/* Yes. */
}
else
{
/* No - read the rest. */
boost::asio::async_read(/*...*/);
}
}
}
Блестяще, спасибо. – James