Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка данных от сервера (HTTP/HTML), Вопрос про выделение памяти... 
:(
    Опции темы
Phantomas
  Дата 22.4.2010, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



Здравствуйте, речь идет про отправку GET запроса на HTTP сервер и последующего приема данных от него (код страницы).
Интересует как работают браузеры когда принимают страницу, не смотря на то, что они не знают ее вес, они скачивают ее полностью. Размер данных написан в заголовке ответа "Content-Length", неужели для начала выделяется предположительный размер памяти для заголовка, а после его приема идет увеличение памяти и докачивание в нее самих данных?
А что если "Content-Length" не будет указан? Так же интересует каким образом отделяется заголовок от кода страницы? По первым двум подряд идущим CRLF?

Благодарю заранее...

Это сообщение отредактировал(а) Phantomas - 22.4.2010, 21:11
PM MAIL   Вверх
SickFxck
Дата 22.4.2010, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: нет
Всего: 1



Цитата(Phantomas @  22.4.2010,  21:09 Найти цитируемый пост)
неужели для начала выделяется предположительный размер памяти для заголовка, а после его приема идет увеличение памяти и докачивание в нее самих данных?

Да, именно так. Память под саму страницу (не заголовок), очевидно, выделяется после приёма всех заголовков. Если указан Content-length, то выделяется необходимое количество памяти.

Цитата(Phantomas @  22.4.2010,  21:09 Найти цитируемый пост)
А что если "Content-Length" не будет указан?

Возможно два случая: либо страница передаётся так называемыми "чанками" (http://en.wikipedia.org/wiki/Chunked_transfer_encoding), либо "конец" страницы — обрыв соединения со стороны сервера.
Как выделяется в данном случае память не скажу. Я даже не уверен, что страницу требуется помещать в один непрерывный блок памяти. Скорее всего какой-нибудь vector (C++, STL) используется или его аналог.

Цитата(Phantomas @  22.4.2010,  21:09 Найти цитируемый пост)
Так же интересует каким образом отделяется заголовок от кода страницы? По первым двум подряд идущим CRLF?

Да. "Пустой" заголовок.

Это сообщение отредактировал(а) SickFxck - 22.4.2010, 21:53
PM MAIL   Вверх
maxim1000
Дата 22.4.2010, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



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

нечто похожее реализовано, например, в std::vector


--------------------
qqq
PM WWW   Вверх
Phantomas
Дата 23.4.2010, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.4.2010

Репутация: нет
Всего: нет



Благодарю за ответы, вот уж не знал что все так произвольно. В основном интересует сколько именно выделять памяти? Хочу в обрез, а тут такое дело что сервер перед "Content-Length" может послать еще множество строк ("Content-Range", "Content-Type" или даже дату).
Может на W3 (www.w3.org) или в каком-либо другом официальном документе указан лимит на заголовок от сервера?

Слава богу работаю только с одним сервером, который указывает "Content-Length".

Это сообщение отредактировал(а) Phantomas - 23.4.2010, 10:41
PM MAIL   Вверх
SickFxck
Дата 23.4.2010, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: нет
Всего: 1



Под заголовок тебе нужно памяти в пределах разумного (один килобайт достаточно более чем). Если заголовок больше (перевода строки всё никак нет), то можно тупо проигнорить оставшуюся часть заголовка. После получания заголовка анализирешь его и сохраняешь какое-то значение, если требуется.

PM MAIL   Вверх
qpAHToMAS
Дата 13.11.2010, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 17.12.2006

Репутация: нет
Всего: нет



Продолжая тему про общение с WEB сервером:
Благодаря сообщениям выше начал набрасывать код по приему chunk'ов. Появился вопрос:
ЯП требует указать количество байт для приема от сервера (на один chunk/пакет), т.е. то число, сколько программе скачивать байт и записывать в память (buffer).
Хочется принять все так, как отправляет сервер, т.е. максимум. Опытным путем удалось определить предельное число байт: 2096. Если попытаться принять больше — возникает критическая ошибка.

Теперь вопрос:
Откуда берется это число (2096)? Это MTU или какая-нибудь отдельная опция на сервере/клиенте?
Все беспокойство связано с работой программы на разных видах подключения/серверах/ос и т.д.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0470 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.