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