BOOST ASIO: как использовать ограниченный размер буфера с async_read_until - PullRequest
2 голосов
/ 02 сентября 2011

Я использую небольшой буфер (например, 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, "\r\n\r\n", boost::bind(my_read_handler, sock, inBuf, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

1 Ответ

5 голосов
/ 02 сентября 2011

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

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

...