Поддержка HTTP с C++ recv winsocket2

Я кодирую свой собственный сокет HTTP fetcher. Я использую C++ в MVC++ и winsocket2.h Я смог запрограммировать сокет для подключения к серверу необходимого веб-сайта и отправить запрос HTTP GET.

Теперь проблема заключается в том, что после того, как я отправляю HTTP-запрос GET с подключением Keep-alive, я вызываю функцию recv, и она работает нормально, за исключением того, что после получения веб-сайта он продолжает оставаться в ожидании тайм-аута от сервера или соединения закрывать!!

Это занимает несколько секунд меньше в зависимости от времени ожидания активности серверов, поэтому я не могу извлечь выгоду из настроек HTTP активности активности.

Как я могу сказать, чтобы функция recv остановилась после получения веб-сайта и вернула мне команду, чтобы я мог отправить еще один HTTP-запрос, избегая при этом другого режима рукопожатия.

Когда я использую неблокирующие сокеты, это работает быстрее, но я не знаю, когда остановиться, я установил str.rfind("",-1,7), чтобы остановить получение данных. однако это не очень эффективно.

Кто-нибудь знает, как это сделать, или каков последний символ, отправляемый HTTP-сервером, когда соединение сохраняется, поэтому я могу использовать его в качестве решения об остановке.

Лучший,
Моу

2 ответа

Решение

Проверьте для Content-Length: xxxxx заголовок, и только читайте байты xxxxx после заголовка, который заканчивается пустой строкой (CR-LF-CR-LF в потоке).

Обновить

Если данные фрагментированы:

Chunked Transfer-Encoding ( ссылка)

...

Тело чанкованного сообщения содержит серию чанков, за которыми следует строка с "0" (ноль), за которыми следуют необязательные нижние колонтитулы (как в заголовках) и пустая строка. Каждый кусок состоит из двух частей:

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

Кроме того, http://www.w3.org/ описание Chunked Transfer-Encoding находится в разделе 3.6.1 @ http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html.

Установите неблокирующий флаг ввода / вывода на сокете, чтобы recv немедленно вернется, только с тем количеством данных, которое уже было получено. Объедините это с select, WSAEventSelect, WSAAsyncSelectили порты завершения, чтобы получать информацию о поступлении данных (вместо ожидания занятости).

Другие вопросы по тегам