tcpclient - Indy TCP - Read data in a loop -


a tcp server sending data frames continuosly every 8ms. want program client able receive these data frames. there procedure in indy 9 know if there data available in buffer?

my current programs following (i using thread):

procedure tthreadread.execute; var   buffer: array [0..755] of byte;   //s1: string;   //i: integer; begin   idtcpclient1.recvbuffersize:= 756;   idtcpclient1.connect;   while terminated = false   begin     if idtcpclient1.inputbuffer.size = 0        idtcpclient1.readfromstack(true,0,false);     while idtcpclient1.inputbuffer.size > 0     begin        readbuffer(buffer, fclient.inputbuffer.size);        //s1:= '';        //for i:=0 length(buffer)-1        //  s1:=s1+inttohex(ord(buffer[i]),2); //read values-->global var        //form1.memo1.text:=s1;     end;   end; end; 

is there more efficient solution reading tcp data continuously (like onread event in udp)?

thanks in advance.

tidtcpclient not asynchronous component. not tell when data arrives. need use timer or thread periodically poll socket new data (tidudpserver uses internal thread trigger onudpread event), eg:

procedure tform1.button1click(sender: tobject); begin   idtcpclient1.connect;   timer1.enabled := true; end;  procedure tform1.button2click(sender: tobject); begin   timer1.enabled := false;   idtcpclient1.disconnect; end;  procedure tform1.timer1timer(sender: tobject); var   s1: string; begin   s1 := idtcpclient1.currentreadbuffer;   ... end; 

with said, currentreadbuffer() not best choice use. typically more instead:

procedure tform1.timer1timer(sender: tobject); begin   timer1.enabled := false;    idtcpclient1.readfromstack(true, 0, false);    while idtcpclient1.inputbuffer.size > 0   begin     // read 1 complete frame , process needed ...   end;    timer1.enabled := true; end; 

update: given new information frame structure , switch thread, should doing instead:

procedure tthreadread.execute; var   buffer: array of byte;   numbytes: integer; begin   setlength(buffer, 0);   idtcpclient1.connect;   try     while not terminated     begin       numbytes := strtoint('$' + idtcpclient1.readstring(8)) - 8;       if numbytes <> length(buffer)         setlength(buffer, numbytes);       if numbytes > 0         idtcpclient1.readbuffer(buffer[0], numbytes);       // process buffer numbytes needed...     end;       idtcpclient1.disconnect;   end; end; 

Comments

Popular posts from this blog

java - Play! framework 2.0: How to display multiple image? -

gmail - Is there any documentation for read-only access to the Google Contacts API? -

php - Controller/JToolBar not working in Joomla 2.5 -