Автор Тема: Не целые страницы  (Прочитано 2319 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн mihail_1

  • Местный житель
  • ***
  • Сообщений: 169
Не целые страницы
« : 14 Января 2014, 10:30:49 »
Получаю по HTTP через сокет содержимое страниц отдаваемое серверами. В отдельных случаях приходит только часть страницы. Сообщений об Ошибках при этом не бывает. Сервера не всегда передают в заголовке длинну страницы. Как проверять что страница пришла не вся?
 

Онлайн endru

Re: Не целые страницы
« Ответ #1 : 15 Января 2014, 18:13:40 »
Можно по подробней, каким образом вы получаете страницу (браузер, скрипты и т.д.) и более подробно.
И, если не коммерческая тайна, каким серверам отправляете запросы?

Оффлайн mihail_1

  • Местный житель
  • ***
  • Сообщений: 169
Re: Не целые страницы
« Ответ #2 : 15 Января 2014, 18:34:57 »
Программа на Си.
connect(...);
send(...);
цикл recv(...) пока >0
если 0 корректное завершение, если <0 - ошибка

К разным серверам (сейчас в базе около 100000 адресов сайтов)
 

Онлайн endru

Re: Не целые страницы
« Ответ #3 : 15 Января 2014, 19:14:01 »
Проверять сохранные данные? всегда же последним передается тег </html>

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

Оффлайн mihail_1

  • Местный житель
  • ***
  • Сообщений: 169
Re: Не целые страницы
« Ответ #4 : 15 Января 2014, 19:28:40 »
Тег </html> может быть не в конце документа, а может и вообще отсутствовать, это ни как не повлияет на отображение страниц в браузерах, но вроде бы бразеры как-то определяют, если страница загружена не вся.
 

Онлайн endru

Re: Не целые страницы
« Ответ #5 : 15 Января 2014, 21:15:06 »
mihail_1, данные в браузере отображаются по мере загрузки html тегов.
Весь контент (картинки к примеру) идут отдельными параллельными запросами браузера к серверу или серверам, смотря куда ведут ссылки в тегах <img> (опять же картинки в пример).
Загрузка продолжается, пока не загрузится весь контент или не сработает timeout на соединение.
</html> всего лишь указывает на логический конец тегов на странице (вам нужно больше?  :) )

Эксперименты: ShowHide

1. проверьте проблемные сервера на примере(жирным выделено что нужно вводить в терминале)
telnet debianforum.ru 80
Trying 5.187.3.236...
Connected to debianforum.ru.
Escape character is '^]'.
GET / HTTP/1.1  //вводим руками или копируем
Host: debianforum.ru  //вводим руками или копируем и нажимаем 2 раза Enter. результат внизу экрана)

2. Иногда сервера в заголовках передают Content-Length указывает на количество байт тела страницы.
А иногда указывается в виде 16-ного числа непосредственно перед телом страницы:

« Последнее редактирование: 15 Января 2014, 21:16:51 от endru »
 

Оффлайн mihail_1

  • Местный житель
  • ***
  • Сообщений: 169
Re: Не целые страницы
« Ответ #6 : 15 Января 2014, 21:43:50 »
Для браузера тег html лишь контейнер для которого могут быть прописаны стили, но никак не начало/конец отображаемого документа. Поэтому наличие в конце документа или где-то в документе </html> не гарантирует что документ загрузился весь. Его отсутствие не гарантирует, что документ загрузился не полностью.

Моя программа не является браузером и не запрашивает картинки вместе с кодом страницы. В баузерах я давно не видел после завершения загрузки неполные страницы.

Случаи timeout и другие ошибки отслеживаются. Прием неполного документа, так же как и полного завершается, когда recv(...) возвращает первый 0, после одного или нескольких положительных значений. (используется блокирующий режим)
 

Онлайн endru

Re: Не целые страницы
« Ответ #7 : 15 Января 2014, 21:54:33 »
mihail_1, не спорю, теги не обязательны. было предложено как вариант  :)
что насчет 2 пункта под спойлером?

Оффлайн mihail_1

  • Местный житель
  • ***
  • Сообщений: 169
Re: Не целые страницы
« Ответ #8 : 16 Января 2014, 13:07:46 »
Content-Length многие сервера не передают, поэтому тоже ненадежный способ, а второй вариант передачи вижу вообще впервые.

Telnet для ручной проверки я пытался использовать, но потери нестабильны и поймать их руками не удается. Сервера здесь не виноваты, потери пакетов происходят на магистральных каналах (но чем дальше до сервера тем выше вероятность потери).
Странно, что TCP, который в отличии от UDP должен предотвращать эти потери, на практике ни чем не помогает. Или он просто не сообщает о потерях протоколам которые над ним?
 

Онлайн endru

Re: Не целые страницы
« Ответ #9 : 16 Января 2014, 16:07:03 »
а второй вариант передачи вижу вообще впервые.
http://ru.wikipedia.org/wiki/Chunked_transfer_encoding  :)

Оффлайн mihail_1

  • Местный житель
  • ***
  • Сообщений: 169
Re: Не целые страницы
« Ответ #10 : 16 Января 2014, 16:50:29 »
Тогда в заголовке должно быть
Transfer-Encoding: chunked
а этого нет.
 

Онлайн endru

Re: Не целые страницы
« Ответ #11 : 16 Января 2014, 16:58:47 »
mihail_1, хм... очень странно! можете кинуть сервер для примера я его помучаю скриптами  :)

Оффлайн mihail_1

  • Местный житель
  • ***
  • Сообщений: 169
Re: Не целые страницы
« Ответ #12 : 16 Января 2014, 21:58:47 »
Например zonakz.net, но это до меня от него канал плохой (около 1% битых страниц), а до Вас может быть и все хорошо.
 

Теги: