Конференция "Начинающим" » Как синхронизируется http протокол...
 
  • Jolik (30.08.10 14:43) [0]
    ... потребовалось сделать простой http сервер для обмена данными (чтобы пакеты без проблем ходили через маршрутизаторы).
    Возник вопрос - а как сервер "узнает", что запрос от клиента поступил полностью? Или он считает, что все что приходит от клиента - это один запрос.
    Поясню: вот сидит сервер, слушает порт. Пошли данные... Исходя из принципов TCP/IP - данные приходят частями и размер их в TCP определить не возможно. Так вот идут данные, мы их принимаем, принимаем, принимаем... и складываем в некоторый буфер. А как узнать, что все, данные закончились? По тайм ауту? А вдруг канал слабый и пакет где нить задержался? А вдруг на той стороне злоумышленник? И льет данные и льет...

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

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

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

    PS: компоненты не предлагать
  • Медвежонок Пятачок © (30.08.10 14:50) [1]
    по пустой строке либо по указанному клиентом контент-ленсу
  • Медвежонок Пятачок © (30.08.10 14:53) [2]
    точнее так:
    сначала считываем в цикле строки по ка не считаем пустую.
    затем смотрим, указано ли в принятом длина контента.
    если указана, читаем дополнительно указанное число байт
  • Anatoly Podgoretsky © (30.08.10 15:14) [3]
    > Пошли данные... Исходя из принципов TCP/IP - данные приходят частями и размер их в TCP определить не возможно.

    По TCP/IP да нельзя, но тут то испольдуется протокол более высокого уровня, а у него есть поле размера, если же поля нет, то по разрыву соединения или по таймауту.
  • Медвежонок Пятачок © (30.08.10 15:19) [4]
    потребовалось сделать простой http сервер

    ну ему-то как бы до сборки пакетов дела нет. это решается этажами ниже.
    его дело работа на прикладном уровне, где никаких пакетов уже нет, есть только данные
  • sniknik © (30.08.10 15:23) [5]
    > так я в заголовке пакета одно из полей отводил под размер - сразу все понятно
    в заголовке ответа от сервера тоже есть размер (ContentLength).  и он проверяется где то "у нутрях" (иначе нафига он нужен?).

    т.что можешь считать, что -
    > все что приходит от клиента - это один запрос.
  • Jolik (30.08.10 16:58) [6]

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


    Все ясно!
    На пстую строку я внимания не обратил.
    Спасибо.
 
Конференция "Начинающим" » Как синхронизируется http протокол...
Есть новые Нет новых   [134437   +29][b:0][p:0]