In realtà non abbiamo un terminatore, ma un inizio, cioè i messaggi che arrivano dai client
devono iniziare con la parola "MSG1="e poi sono lunghi appunto 25 bytes.
quindi riassumendo mi servirebbe una lista di bytes, uno per ogni client connesso, dove memorizzo gli eventuali pezzi di pacchetti incompleti;
Nell evento di ricezione del dato controllo se ho "MSG1="e prendo fino al successivo "MSG1=" (se esiste), ciclando quindi fino a che ho pezzi da 25 bytes, se ho pezzi piu corti significa che è un pacchetto incompleto e lo memorizzo
per poi metterlo all inizio dei dati ricevuti in un secondo evento,
una cosa cosi'?
procedure TfrmMain.TCPServerReadData(Sender: TObject; aLine: TncLine;
const aBuf: TArray<System.Byte>; aBufCount: Integer);
VAR
lastbytes:TBytes;
MsgArray: TBytes;
msg,Singlemsg,S:string;
begin
IncompletePackets.TryGetValue(ALINE,lastbytes);//IncompletePackets= dictionary contenente tncline e tbytes
msgarray := Copy(aBuf, 0, aBufCount);
msg:=StringOf(MsgArray);
if Length(lastbytes) > 0 then
begin
msg:=StringOf(lastbytes)+msg;
lastbytes:=[];
end;
while Pos(cMsgHeader1,MSG)>0 do
begin
msg:= Copy(msg,Pos(cMsgHeader1,MSG)+8,Length(msg)-8);
if Pos(cMsgHeader1,msg)>0 then
begin
Singlemsg:=Copy(msg,0,Pos(cMsgHeader1,msg)-1);
end else
begin
singlemsg:=msg;
end;
S:=cMsgHeader1+Singlemsg;
MsgArray:=BytesOf(S);
if Length(MsgArray)<25 then
begin
lastbytes:= MsgArray;
end
else
begin
// MsgArray// ho il mio messaggio di 25 bytes
end;
end;
end;