2 Mart 2017 Perşembe

Delphi Indy TCP componentini kullanarak data gönderip alma

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