![]() |
|
|
![]()
|
|
| Phantomas |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 22.4.2010 Репутация: нет Всего: нет |
Здравствуйте, речь идет про отправку GET запроса на HTTP сервер и последующего приема данных от него (код страницы).
Интересует как работают браузеры когда принимают страницу, не смотря на то, что они не знают ее вес, они скачивают ее полностью. Размер данных написан в заголовке ответа "Content-Length", неужели для начала выделяется предположительный размер памяти для заголовка, а после его приема идет увеличение памяти и докачивание в нее самих данных? А что если "Content-Length" не будет указан? Так же интересует каким образом отделяется заголовок от кода страницы? По первым двум подряд идущим CRLF? Благодарю заранее... Это сообщение отредактировал(а) Phantomas - 22.4.2010, 21:11 |
|||
|
||||
| SickFxck |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 16.4.2010 Репутация: нет Всего: 1 |
Да, именно так. Память под саму страницу (не заголовок), очевидно, выделяется после приёма всех заголовков. Если указан Content-length, то выделяется необходимое количество памяти. Возможно два случая: либо страница передаётся так называемыми "чанками" (http://en.wikipedia.org/wiki/Chunked_transfer_encoding), либо "конец" страницы — обрыв соединения со стороны сервера. Как выделяется в данном случае память не скажу. Я даже не уверен, что страницу требуется помещать в один непрерывный блок памяти. Скорее всего какой-нибудь vector (C++, STL) используется или его аналог.
Да. "Пустой" заголовок. Это сообщение отредактировал(а) SickFxck - 22.4.2010, 21:53 |
||||
|
|||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
есть такой вариант:
выделяем какой-то стартовый кусок памяти, а потом постепенно больше и больше когда выделяем больший кусок, в его начало копируем то, что есть на данный момент но если на каждый байт делать перевыделение, будет слишком долго поэтому каждый раз выделяется в два раза больше чем раньше копирований и перевыделений становится гораздо меньше нечто похожее реализовано, например, в std::vector -------------------- qqq |
|||
|
||||
| Phantomas |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 22.4.2010 Репутация: нет Всего: нет |
Благодарю за ответы, вот уж не знал что все так произвольно. В основном интересует сколько именно выделять памяти? Хочу в обрез, а тут такое дело что сервер перед "Content-Length" может послать еще множество строк ("Content-Range", "Content-Type" или даже дату).
Может на W3 (www.w3.org) или в каком-либо другом официальном документе указан лимит на заголовок от сервера? Слава богу работаю только с одним сервером, который указывает "Content-Length". Это сообщение отредактировал(а) Phantomas - 23.4.2010, 10:41 |
|||
|
||||
| SickFxck |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 16.4.2010 Репутация: нет Всего: 1 |
Под заголовок тебе нужно памяти в пределах разумного (один килобайт достаточно более чем). Если заголовок больше (перевода строки всё никак нет), то можно тупо проигнорить оставшуюся часть заголовка. После получания заголовка анализирешь его и сохраняешь какое-то значение, если требуется.
|
|||
|
||||
| qpAHToMAS |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 17.12.2006 Репутация: нет Всего: нет |
Продолжая тему про общение с WEB сервером:
Благодаря сообщениям выше начал набрасывать код по приему chunk'ов. Появился вопрос: ЯП требует указать количество байт для приема от сервера (на один chunk/пакет), т.е. то число, сколько программе скачивать байт и записывать в память (buffer). Хочется принять все так, как отправляет сервер, т.е. максимум. Опытным путем удалось определить предельное число байт: 2096. Если попытаться принять больше — возникает критическая ошибка. Теперь вопрос: Откуда берется это число (2096)? Это MTU или какая-нибудь отдельная опция на сервере/клиенте? Все беспокойство связано с работой программы на разных видах подключения/серверах/ос и т.д. |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |