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
Post a Comment