Советы по Delphi

         

TCLIENTSOCKET и TSERVERSOCKET: Почему сокету невозможно передать более чем 8K данных?


Поскольку IP-слой режет поток данных на куски размером 8k, разработчик должен явно включить целочисленную длину в начало потока, сообщающую приемную сторону размер ожидаемых данных, для нее очень важным является число 8k-пакетов, которые необходимо принять.

Поскольку Socket-компоненты являются простыми обертками для WinSock, а не протоколами с информационными заголовками (как было указано выше), разработчик должен сам беспокоиться об "заполнении" их данными. Для этого необходимо:
ПРИМЕЧАНИЕ: реализация может быть изменена разработчиком, поэтому приведены общие рекомендации.

  1. заполнение данными источника пакетами с целочисленной длиной,
  2. целочисленная длина извлекается целевым хостом,
  3. подсчитываем количество принятых байт и сопоставляем с длиной пакета.
  4. если TotalBytesReceived <> LengthInteger, то следующий пакет является продолжением, в противном случае решаем, что далее в потоке следует ожидать очередной пакет.
ПРИМЕЧАНИЕ: это обрабатывается протоколами HTTP & FTP через информацию заголовка (например, 'Content\Length:'). [001967]



Содержание раздела