Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Когда приходит несколько пакетов в одном

01.01.2007
{ **** UBPFD *********** by kladovka.net.ru ****
>> Разбиение полученных данных через ClientSocket и ServerSocket, когда приходит несколько пакетов в одном.
 
При получении нескольких данных по socket иногда приходят два и более пакета в одном.
Здесь пример, как разбить при получении полученную строку на несколько отправленных.
 
Зависимости: System, ScktComp
Автор:       cyborg, cyborg1979@newmail.ru, ICQ:114205759, Бузулук
Copyright:   Собственное написание (Осипов Евгений Анатольевич)
Дата:        23 мая 2002 г.
********************************************** }
 
{Разделитель строк, добавляется в конец отсылаемых данных,
можно написать любой, какой нравится/какой вам подойдёт}
Const Delitel : String = #13#10;
 
 
{Процедура обработки строк, S-передаваемая строка,
Socket - Передаваемый сокет откуда пришли данные}
Procedure Process_Message(Var S : AnsiString; Var Socket: TCustomWinSocket);
Begin
 {Обрабатываем здесь полученные данные S из сокета Socket}
End;
 
 
{Обработака события по получению данных из ClientSocket,
а так же действенно и для ServerSocket}
procedure TMyForm.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
Var S1,S2 : AnsiString;
    I : Integer;
begin
  S1:=Socket.ReceiveText; {Присваиваем S1 полученную строку из Socket}
  I:=0;
    Repeat {Разделяем строку, если одновременно пришло несколько}
      I:=Pos(Delitel,S1); {Ищем раздлелитель Delitel в строке S1}
      if I<>0 then {Если найден делитель, тогда ...
      Если не найден, то вы не добавили в конце отсылаемой строки Delitel !}
        Begin
          S2:=Copy(S1,1,I-1);{Копируем одну пришедшую строку в S2}
          Delete(S1,1,I+Length(Delitel)-1);{Удаляем уже скопированную строку}
          Process_Message(S2,Socket);
          {Вызываем процедуру обработки полученных строк,
          где S2 наша выделенная строка}
        End;
    Until I=0; {Повторять, пока будет не найден разделитель Delitel}
end;