An example on how I do it:

procedure TUser.SocketDataAvailable(Sender: TObject; Error: Word);
Var a: Integer;
    abc,d: string;
begin
 if ToRcv = 0 then  // NEW PACKET INCLUDING HEADER
  begin
   NBuffer:= NBuffer + NSocket.ReceiveStr;
   AnalyzePacket;
  end
 else
  begin
   if NSocket.RcvdCount < ToRcv then Exit; // THERES MORE DATA TO RECEIVE TO 
COMPLETE PACKET
   NBuffer:= NBuffer + NSocket.ReceiveStr;
   abc:= funcs.Decr(Copy(NBuffer,1,PacketLnght),EncodePswd,True);  // 
dismiss, just decription of data
   Delete(NBuffer,1,PacketLnght);  // KEEP NEW PACKET DATA ON THE BUFFER IF 
ANY
   NewCommand(abc);  // PROCESS A FULL RECEIVED PACKET
   ToRcv:= 0;
   AnalyzePacket; // CHECK IF REAMINING DATA ON THE BUFFER CONTAINS HEADER 
FOR NEXT PACKET
  end;
end;

Procedure TUser.AnalyzePacket;
Var a: Integer;
    abc: String;
Label 1;
begin
1:
 if NBuffer = '' then Exit;
 a:= Pos(#0,NBuffer); // #0 = END OF PACKET HEADER
 if (a < 1) or (a = length(NBuffer)) then Exit; // NO DATA AFTER THE HEADER

 PacketLnght:= StrToInt(copy(NBuffer,1,a-1)); // PACKET LENGHT IN STRING 
FORM (/blush, old code :p)
 Delete(NBuffer,1,a); // DELETE HEADER

 ToRcv:= PacketLnght - length(NBuffer); // SIZE OF REAMAINING DATA TO 
COMPLETE PACKET
 if ToRcv < 1 then // IF PACKET IS FULL PROCEED TO DECODE DATA AND PROCESS A 
NEW COMMAND
  begin
   abc:= funcs.Decr(Copy(NBuffer,1,PacketLnght),EncodePswd,True);
   Delete(NBuffer,1,PacketLnght);
   NewCommand(abc);
  end;

 if ToRcv < 0 then goto 1;
end;

procedure TUser.SendCommand(Cmd: byte; params: string);
var  q,r: string;
begin
q:= Funcs.Encr(chr(Cmd)+Params,EncodePswd,True);
r:= IntToStr(length(q))+#0;
NSocket.SendStr(r+q);
end;


-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to