Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.11.21;
Скачать: [xml.tar.bz2];

Вниз

Как синхронизируется http протокол...   Найти похожие ветки 

 
Jolik   (2010-08-30 14:43) [0]

... потребовалось сделать простой http сервер для обмена данными (чтобы пакеты без проблем ходили через маршрутизаторы).
Возник вопрос - а как сервер "узнает", что запрос от клиента поступил полностью? Или он считает, что все что приходит от клиента - это один запрос.
Поясню: вот сидит сервер, слушает порт. Пошли данные... Исходя из принципов TCP/IP - данные приходят частями и размер их в TCP определить не возможно. Так вот идут данные, мы их принимаем, принимаем, принимаем... и складываем в некоторый буфер. А как узнать, что все, данные закончились? По тайм ауту? А вдруг канал слабый и пакет где нить задержался? А вдруг на той стороне злоумышленник? И льет данные и льет...

Та же история и с джаббером. Но там хоть по структуре XML как то можно ориентироваться - где конец, где начало...

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

Проясните, если кто может...
Заранее благодарен!

PS: компоненты не предлагать


 
Медвежонок Пятачок ©   (2010-08-30 14:50) [1]

по пустой строке либо по указанному клиентом контент-ленсу


 
Медвежонок Пятачок ©   (2010-08-30 14:53) [2]

точнее так:
сначала считываем в цикле строки по ка не считаем пустую.
затем смотрим, указано ли в принятом длина контента.
если указана, читаем дополнительно указанное число байт


 
Anatoly Podgoretsky ©   (2010-08-30 15:14) [3]

> Пошли данные... Исходя из принципов TCP/IP - данные приходят частями и размер их в TCP определить не возможно.

По TCP/IP да нельзя, но тут то испольдуется протокол более высокого уровня, а у него есть поле размера, если же поля нет, то по разрыву соединения или по таймауту.


 
Медвежонок Пятачок ©   (2010-08-30 15:19) [4]

потребовалось сделать простой http сервер

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


 
sniknik ©   (2010-08-30 15:23) [5]

> так я в заголовке пакета одно из полей отводил под размер - сразу все понятно
в заголовке ответа от сервера тоже есть размер (ContentLength).  и он проверяется где то "у нутрях" (иначе нафига он нужен?).

т.что можешь считать, что -
> все что приходит от клиента - это один запрос.


 
Jolik   (2010-08-30 16:58) [6]


> сначала считываем в цикле строки по ка не считаем пустую.
>
> затем смотрим, указано ли в принятом длина контента.
> если указана, читаем дополнительно указанное число байт


Все ясно!
На пстую строку я внимания не обратил.
Спасибо.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.11.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.003 c
15-1281587871
IGray
2010-08-12 08:37
2010.11.21
Ищу исходники функции IntToStr на паскале


15-1281353446
12
2010-08-09 15:30
2010.11.21
Из-за чего может быть SystemError 1158 ?


15-1280988195
12
2010-08-05 10:03
2010.11.21
Шахматная программа


2-1282880802
Гость
2010-08-27 07:46
2010.11.21
Существует ли аналог Википедии по функциям Дельфи?


2-1282601157
XLMD
2010-08-24 02:05
2010.11.21
чтение файлов или бесовщина





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский