Задать вопрос
lightalex
@lightalex

Как правильно читать с помощью boost::asio::read до определенного символа?

Всем привет!
Есть следующий код на C++ для приема ответов на POST запросы:
boost::asio::write(*socket, request);
std::vector<char> response(10 * 1024);
boost::system::error_code ec;
auto bytes_received = boost::asio::read(*socket, boost::asio::buffer(response), boost::asio::transfer_all(), ec);
std::cout << response.data() << std::endl;

Проблема в том что я пытаюсь сохранить соединение (connection: keep-alive) и в связи с этим сервер не сообщает конец, а response задан по размерам больше чем ожидаемое сообщение
Так что ответ он принимает до таймаута, что довольно долго...
Я пытаюсь сделать чтобы он принимал ответ до определенного символа и не ждал конца
Увы пока ничего не получилось :(
Это вообще возможно?
Если да, то помогите пожалуйста! Буду очень благодарен!
  • Вопрос задан
  • 1834 просмотра
Подписаться 1 Оценить 10 комментариев
Решения вопроса 2
15432
@15432
Системный программист ^_^
я б принимал данные в буфер и парсил уже его.
1) как только в сокете появляются данные -> читаем в буфер
2) после каждого чтения проверяем, не сформировался ли в буфере полный HTTP заголовок
3) как только наберется заголовок, парсим и выкусываем его
4) аналогично по частям ждём, собираем и парсим JSON
5) повторяем всё с начала - ждём новый HTTP заголовок и так далее

моя прокся на сях, где чёрт ногу сломит
(сомневаюсь, что сильно поможет xD)
Ответ написан
TrueBers
@TrueBers
Гуглю за еду
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Andrey_1984
Извините пожалуйста, к сожалению не смог понять совет от 15432:
я б принимал данные в буфер и парсил уже его. 
1) как только в сокете появляются данные -> читаем в буфер
2) после каждого чтения проверяем, не сформировался ли в буфере полный HTTP заголовок

Подскажите пожалуйста, если не сложно, а как это сделать ?
1)То есть, вот п.1, как только в сокете появляются данные читаем их в буффер. Но функция read сама их будет читать в предоставленный ей к примеру streambuf автоматически. Мы же не вручную читаем ?
2)А второй пункт вообще к сожалению не смог понять. Вот к примеру, как и писал ТС с сервером поддерживается соединение keepalive, то есть сервер передал вме данные, но соединение не закрываетмя, а значит функция read заблокирована. То есть read все еще ждет. Как можно прочитать что то из буффера, если еще выполняется функция read ??
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы