Поддержка HTTP с C ++ recv winsocket2 - PullRequest
2 голосов
/ 08 февраля 2011

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

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

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

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

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

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

Best
Моу

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

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

update

Если данные разделены на части:

Кодирование передачи с разделением на блоки ( ссылка )

...

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

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

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

0 голосов
/ 08 февраля 2011

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

...