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 2

1 ответ:

Когда предоставленный буфер недостаточно велик, async_read_until заполняет его полностью и затем вызывает обработчик чтения с кодом ошибки asio::error::not_found, Что означает, что разделитель не был найден.

В этот момент вы можете .consume() Некоторые (или все) данные из буфера и снова вызвать async_read_until. С 128-байтовым буфером может быть трудно гарантировать, что, когда разделитель наконец найден, он находится в точной последней позиции в буфере (и даже тогда, с четырехбайтовым разделителем, у вас будет только последний разделитель). 124 байта до него). Возможно, лучше всего использовать больший буфер и buffer.consume(buffer.size()-128) в обработчике ошибок not_found, чтобы убедиться, что есть по крайней мере 128 байт, свободных в любое время.