![]() |
|
Модераторы: feodorv |
![]()
|
|
| MANAB |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 17.5.2009 Где: Беларусь, Минск Репутация: нет Всего: нет |
Моя программка через Winsock отправляет HTTP-запрос на сервер, мол хочу получить такую-то страницу. Сервер отвечает - нате. Все приходит. Вопрос, а как узнать, что оно пришло полностью? Особенно, когда не указан Content-Length:
Ответ не всегда заканчивается какими-то специальными символами, а даже если и заканчивается, нет гарантии, что блок из середины пакета не заканчивается им, и тогда получится что я приму не весь ответ. Так же признаком не является факт, что функция recv выдала нам байт меньше, чем у нас буфер - за время цикла буфер мог просто не заполниться полностью. 0 байт как признак окончания выдается только когда истечет таймаут, что меня абсолютно не устраивает. Это сообщение отредактировал(а) MANAB - 4.10.2010, 13:30 |
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
В ответе либо указана длина, либо данные передаются "кусочками" (Transfer-Encoding: chunked, ежели память не изменяет). Третьего не дано. Суть кусочков - сначала размер кусочка (в виде строки-числа с \r\n на конце), затем данные кусочка. Ежели всё - тогда размер кусочка == 0.
|
|||
|
||||
| MANAB |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 17.5.2009 Где: Беларусь, Минск Репутация: нет Всего: нет |
Т.е. получается, надо каждый раз парсить при получении куска буфера.
Просто не хотелось бы нагружать функцию этим. Вот если бы сразу по окончании передачи при вызове recv приходил 0, было бы удобно... |
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
Парсить всё равно придется. Другое дело, что можно сначала скачать, затем всё распарсить. Сервер EOF выдает после завершения передачи, если включить в запросе "Connection: close" Правда для следующего запроса придется открывать соединение по-новой Это сообщение отредактировал(а) GrayCardinal - 4.10.2010, 15:12 |
|||
|
||||
| MANAB |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 17.5.2009 Где: Беларусь, Минск Репутация: нет Всего: нет |
Если кому-нибудь понадобится, то следующий код работает:
Тему можно закрывать Это сообщение отредактировал(а) MANAB - 4.10.2010, 17:26 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |