BOOST ASIO: как использовать ограниченный размер буфера с асинхронным чтением до
Я использую небольшой буфер (например, 128 байт) и хочу использовать "async_read_until" с большими входящими сообщениями по TCP-соединению (отбрасывая все, кроме последних 128 байт до разделителя).
Как это можно сделать? В документах ASIO не очень ясно, что происходит, когда предоставленный буфер недостаточно велик.
Вот мой код для инициализации чтения
typedef boost::shared_ptr<boost::asio::streambuf >streambuf_ptr;
streambuf_ptr inBuf(new boost::asio::streambuf (128));
boost::asio::async_read_until(*sock, *inBuf, "rnrn", boost::bind(my_read_handler, sock, inBuf, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
1 ответ:
Когда предоставленный буфер недостаточно велик,
async_read_until
заполняет его полностью и затем вызывает обработчик чтения с кодом ошибкиasio::error::not_found
, Что означает, что разделитель не был найден.В этот момент вы можете
.consume()
Некоторые (или все) данные из буфера и снова вызватьasync_read_until
. С 128-байтовым буфером может быть трудно гарантировать, что, когда разделитель наконец найден, он находится в точной последней позиции в буфере (и даже тогда, с четырехбайтовым разделителем, у вас будет только последний разделитель). 124 байта до него). Возможно, лучше всего использовать больший буфер иbuffer.consume(buffer.size()-128)
в обработчике ошибокnot_found
, чтобы убедиться, что есть по крайней мере 128 байт, свободных в любое время.