Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 06.12.2019, 13:55   #1
bacivir
 
Регистрация: 04.12.2019
Сообщений: 9
По умолчанию Фрагментаия TCP

Подскажите, пытаюсь побороть фрагментацию пакетов...
Код написал, работает, но в боевых условиях проверить пока не могу так как сейчас все приходит на сервер одним пакетом(clients[i].CountPocket=1), проверял до 16 к символов...

Жизнеспособен ли этот код (хотя бы в теории)? Больше нечего в голову не лезет..

Склеиваю пакет так
Код:
//Это для проверки пакета на целостность...
Procedure ResiveCommand(idclient, data: String);
var
JSON: TJSONObject;
begin
  try
  JSON := TJSONObject.ParseJSONValue(data) as TJSONObject;
  if Assigned(JSON) then
    ServerForm.Memo1.Lines.Add('JSON SINTAX OK') else ServerForm.Memo1.Lines.Add('JSON SINTAX DAMAGE');

  finally
    FreeAndNil(JSON);
  end;

end;



procedure TServerForm.IdTCPServer1Execute(AContext: TIdContext);
var
i: Integer;
temp,idconnect: String;
begin
temp:= AContext.Connection. IOHandler.ReadLn;
idconnect:= AContext.Connection.Socket.Binding.PeerIP+':'+AContext.Connection.Socket.Binding.PeerPort.ToString;

      for i:=1 to High(clients) do
      if (clients[i].Used) and (clients[i].clientID = idconnect) then
      begin

          if (pos('<',temp)>=1) and (pos('>',temp)>=1) then
            begin  //начало пакета
              clients[i].buffer:='';
              clients[i].lengt:=0;
              clients[i].LengthTotal:=0;
              clients[i].CountPocket:=0;

              clients[i].LengthTotal := copy(temp,2,Pos('>',temp)-2 ).ToInteger;
              exit;
            end else
            begin  //дописываю
              clients[i].buffer := clients[i].buffer + temp;
              inc (clients[i].CountFragment);
              clients[i].lengt := length (clients[i].buffer);
            end;


              //Длинна итого = полученной!
            if clients[i].lengt = clients[i].LengthTotal then
              begin
               ResiveCommand(idconnect, clients[i].buffer);
               memo1.Lines.Add(  'Пакет собран нормально [' + clients[i].CountFragment.ToString + '] Cимволов: '+ length(clients[i].buffer).ToString  );
               clients[i].buffer:='';
               clients[i].lengt:=0;
               clients[i].LengthTotal:=0;
              end;
                //Длинна итого  <> полученной!
            if clients[i].lengt > clients[i].LengthTotal then
              begin
               memo1.Lines.Add(  'Пакет собран  неверно, освобождение переменнных. (принято больше чем ожидалось)' );
               clients[i].buffer:='';
               clients[i].lengt:=0;
               clients[i].LengthTotal:=0;
              end;
      break;
      end;

end;

отправляю пакет предварительно отпраив количество символов перед основным пакетом в скобках <3>NNN

Последний раз редактировалось bacivir; 06.12.2019 в 14:09.
bacivir вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы



Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS