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