LINUX.ORG.RU

[C++,boost::asio::async_read_until] Непонятности с функционированием


0

1

Вот здесь пишут, что по завершении операции async_read_until в буфере могут находиться символы, следующие за указанным разделителем. Возникает вопрос: а что это вообще за «until» такой? Неохота каждый раз из буфера руками строку до разделителя выцеплять.

ну эта операция тебе гарантирует что будет прочитанно как минимум до твоего разделителя.

А что за задача-то стоит? что пишешь? Если HTTP-related, то может стоит посмотреть на cpp-netlib

P.S. streambuf тормозной как непонятно что. Я путем простой замены на статический буфер + ручной поиск разделителя, увеличил скорость работы достаточно хорошо

вот можешь еще у меня на примеры посмотреть - я правда писал 4 года назад, половины уже не помню :-)

ott ★★★★★
()
Ответ на: комментарий от ott

> путем простой замены на статический буфер

Замена streambuf на boost::array


Так, вроде, async_read_until требует именно boost::asio::basic_streambuf, а не что-либо ещё.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

я что-то протормозил, и забыл, что handler получает кол-во считанных данных (до разделителя + разделитель), так что можно смело читать size byte и оставлять остальное в буфере - так вроде корректно будет

ott ★★★★★
()

есть параметр в хандлере std::size_t bytes_transferred, который скажет, сколько байт из streambuf нужно использовать.

anymouse
()
Ответ на: комментарий от ott

> handler получает кол-во считанных данных (до разделителя + разделитель)

А всё остальное за разделителем — откуда приезжает? Если у меня два пакета подряд пойдут с разделителями, то есть вероятность вычитать начало второго в буфер первого?

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

ты должен взять из буфера столько байт, сколько тебе передали в handler (как указано выше). Тогда оставшиеся байты будут считаны при следующем обращении

ott ★★★★★
()
Ответ на: комментарий от one_more_hokum

Общение по COM-порту с железками, интерфейс — DCON, текстовые команды.

А можно для неоссиляторов пояснить, зачем юзать boost::asio? Вроде для этой задачи проще все ручками сделать.

//Мне ASIO показался монструозен и труден для освоения. Но может я чего-то не понимаю.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

> зачем юзать boost::asio?

Ну, во первых, кроссплатформенность. Во вторых я вообще плотно использую boost в работе, и если есть возможность применить что-нить из его потрохов — применяю. И в третьих, всё же asio достаточно удобен, если разобраться с его работой.

one_more_hokum ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.