function TcpClientWriteThenRead(inIP: String; inPort: U32; inTimeout: U32; txData: P_Char; txDataLen: U32; RxData: P_Char;
var RxDataIndex: U32; inIdSSLOpenSSL: TIdSSLIOHandlerSocketOpenSSL = nil): TReturn;
var
IdTCPClient: TIdTCPClient;
RxBuf: TIdBytes;
KeepAlife: TDateTime;
RxDataLen, Maxbuffer: U32;
idTXData: TIdBytes;
begin
IdTCPClient := TIdTCPClient.Create;
if Assigned(inIdSSLOpenSSL) then
Begin
IdTCPClient.IOHandler := inIdSSLOpenSSL;
End;
result.Init;
try
Maxbuffer := RxDataIndex;
RxDataIndex := 0;
IdTCPClient.Host := inIP;
IdTCPClient.Port := inPort;
IdTCPClient.ConnectTimeout := inTimeout;
result.SetDurum(4, 'Connecting...');
IdTCPClient.Connect;
// if not IdTCPClient.Connected then IdTCPClient.Connect;
if IdTCPClient.Connected then
begin
result.SetDurum(2, 'Connected after send data');
SetLength(idTXData, txDataLen);
memcpy(@idTXData[0], txData, txDataLen);
IdTCPClient.Socket.UseNagle := false;
IdTCPClient.Socket.write(idTXData);
SetLength(idTXData, 0);
idTXData := nil;
// IdTCPClient.Socket.Write(TIdBytes(txData),txDataLen);
RxBuf := nil;
KeepAlife := IncMilliSecond(now, inTimeout);
while (IdTCPClient.Connected) do
with IdTCPClient.IOHandler do
begin
if not InputBufferIsEmpty then
begin
result.SetOk('Receiver Data');
KeepAlife := IncMilliSecond(now, 200);
InputBuffer.ExtractToBytes(RxBuf);
RxDataLen := length(RxBuf);
memcpy(@RxData[RxDataIndex], @RxBuf[0], RxDataLen);
RxDataIndex := RxDataIndex + RxDataLen;
/// Debug('%d/%d',[RxDataIndex ,RxDataLen]);
CheckForDataOnSource(1);
RxBuf := nil;
if RxDataIndex > Maxbuffer then
IdTCPClient.Disconnect;
end
else
begin
if (KeepAlife <= now) then
begin
IdTCPClient.Disconnect;
end;
end;
end;
if RxDataIndex = 0 then
result.SetDurum(-4, 'No Receiver data');
end
else
result.SetDurum(-1, 'not Connect');
except
on e: exception do
result.SetDurum(-2, 'TCP Err:' + e.Message);
end;
try
if Assigned(IdTCPClient) then
FreeAndNil(IdTCPClient);
except
end;
end;
Hiç yorum yok:
Yorum Gönder