Подскажите, пытаюсь побороть фрагментацию пакетов...
Код написал, работает, но в боевых условиях проверить пока не могу так как сейчас все приходит на сервер одним пакетом(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