tempo de conexão do TIDTCPClient

Delphi

03/11/2008

estou fazendo um tipo de port scanner, usando idTcpClient da paleta indy. O objetivo é verificar se tem portas abertas no meu servidor que eu não queira que estejam abertas, ou se tem portas de saida que me permitem sair como client para uma conexão remota na internet, num servidor fora do meu.

Para isso estou usando um laço for, um contador i que vai da porta inicial até a porta final e um idtcpclient para apenas conectar em cada porta. Se ele conectar é porque a porta está aberta, creio eu, e se ele não conectar é porque a porta está fechada.

Funciona bem, porem é muito lento, mesmo para dar uma resposta negativa. Coloquei timeout 1, mas não sei se esse 1 é em segundos ou milissegundos, de qualquer forma parece que com ou sem esse timeout demora 1 ou mais segundos para tentar conectar em cada porta. Como eu posso fazer isso de forma mais rápida?


vou colocar aqui o codigo do meu programa:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdAntiFreezeBase, IdAntiFreeze, ExtCtrls, IdIntercept,
  IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack;

//const
  //PORTA_INI = 80;
  //PORTA_FIN = 4000;
  //PROCESS_MESSAGES_TIMEOUT = 100;

type
  TForm1 = class(TForm)
    tcp: TIdTCPClient;
    mLista: TMemo;
    btTesta: TButton;
    edServer: TEdit;
    Label1: TLabel;
    lbStatus: TLabel;
    btChega: TButton;
    IdAntiFreeze1: TIdAntiFreeze;
    Timer1: TTimer;
    Button1: TButton;
    edPortaIni: TEdit;
    edPortaFin: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    edPMT: TEdit;
    Label4: TLabel;
    procedure btTestaClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btChegaClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    FAbort: Boolean;
    FPortaTimer: Integer;
    procedure testar(porta: Integer);
  public
    function PORTA_INI : integer;
    function PORTA_FIN : integer;
    function PROCESS_MESSAGES_TIMEOUT : integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btTestaClick(Sender: TObject);
var port: Integer;
begin
  tcp.Host := edServer.Text;

  FAbort := False;
  FPortaTimer := PORTA_INI;

  for port := PORTA_INI to PORTA_FIN do
  begin

    if FAbort then
    begin
      //close;
      Break;
    end;

    testar(port);
    if( port mod PROCESS_MESSAGES_TIMEOUT) = 0 then
      Application.ProcessMessages;

  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Self.DoubleBuffered := True;
  FAbort := False;
  FPortaTimer := PORTA_INI;
end;

procedure TForm1.btChegaClick(Sender: TObject);
begin
  FAbort := True;
end;

procedure TForm1.testar(porta: Integer);
begin
    lbStatus.Caption := ´testando ´ + IntToStr(porta);
    tcp.Port := porta;

    try
      tcp.Connect;
    except
    end;

    if tcp.Connected then
    begin
      mLista.Lines.Add(IntToStr(tcp.Port));
      tcp.Disconnect;
    end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

    if FAbort then
    begin
      Timer1.Enabled := False;
      //close;
    end;

  if not tcp.Connected then
  begin
    testar(FPortaTimer);
    Inc(FPortaTimer);
  end;

  if FPortaTimer >= PORTA_FIN   then
    Timer1.Enabled := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  tcp.Host := edServer.Text;
  FAbort := False;
  FPortaTimer := PORTA_INI;

  Timer1.Enabled := True;
end;

function TForm1.PORTA_FIN: integer;
begin
  Result := StrToInt(edPortaFin.Text);
end;

function TForm1.PORTA_INI: integer;
begin
  Result := StrToInt(edPortaIni.Text);
end;

function TForm1.PROCESS_MESSAGES_TIMEOUT: integer;
begin
  Result := StrToInt(edPMT.Text);
end;

end.



Vitor Rubio

Vitor Rubio

Curtidas 0
POSTAR