W którym momencie IdTCPClient1.connected zwraca "true"?

0

Zrobiłem pętlę, w której IDTcpclient próbuje w kółko bezskutecznie łączyć się z czterema różnymi hostami. Celowo podaję mu cztery nieistniejące adresy, żeby ciągle ponawiał próby łączenia. Wklejam kod:

procedure TForm1.polacz;
begin
while not IDTcpclient1.Connected do begin
IdTCPclient1.Host:=addresslist[indeks];
  try
  Memo1.Lines.Add('Łączę z:  ' + addresslist[indeks]);
  IdTCPclient1.Connect;
  except
  if indeks<4 then inc(indeks) else indeks:=1;
  end;
end;
end;

W Timerze zaś umieściłem linijkę, która sprawdza cyklicznie czy ów IDTcpclient jest połączony. Wklejam kod:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if IDTcpclient1.Connected then Memo2.Lines.Add('czarne') else Memo2.Lines.Add('białe') ;
end;

Dziwi mnie, że wyniki są różne. Większość razy funkcja zwraca "True", tak jakby był połączony. A czasem wypisuje mi, że nie jest połączony. Przecież teoretycznie nigdy nie jest skutecznie połączony. Skąd te różne wyniki?
Natomiast, gdy podam mu prawdziwy adres i IDTcpclient1 zestawi połączenie to funkcja już się uspokaja i zawsze zwraca "True".

W którym momencie można naprawdę ufać funkcji IDTcpclient1.connected ?
Może ktoś z szanownych forumowiczów mi to wytłumaczy, bo ja tego, kurna, nicht ferstehen.
Jest tak bez względu na to jak długi dam ConnectTimeout.

3

Nie wiem co to za wersja Indy ale sprawdziłem na 10.6.2.5366 i nic takiego się nie dzieje zresztą nie pamiętam aby kiedykolwiek były z tym problemy. Do tego przede wszyskim po co Timer skoro IdTCPclient ma zdarzenie OnStatus wiec poprawny kod wykonujący to zadanie mógłby wyglądać np. tak:

procedure TForm2.btnDisconnectClick(Sender: TObject);
begin
  IdTCPclient1.Disconnect;
end;

procedure TForm2.btnCancelClick(Sender: TObject);
begin
  IdTCPclient1.Tag:= 1;
end;

procedure TForm2.btnConnectClick(Sender: TObject);
const
  HOSTS: array [0..3] of string = ('sowent.as45',
                                    'planta823454.ada',
                                    'aaaa.dfaadw',
                                    'samolen.frt');
var
  HostName: string;
begin
  IdTCPclient1.Tag:= 0;
  while True do
  begin
    for HostName in HOSTS do
    begin
      try
        Application.ProcessMessages;
        IdTCPclient1.Host:= HostName;
        IdTCPclient1.Connect;
      except
      end;
      if (IdTCPclient1.Connected) or (IdTCPclient1.Tag <> 0) then exit;
    end;
  end;
end;

procedure TForm2.IdTCPClient1Status(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: string);
const
  STATUS: array [0..4] of string = ('Poszukiwanie hosta: %s', //hsResolving
                                    'Łączenie z: %s', //hsConnecting
                                    'Połaczony z: %s', //hsConnected
                                    'Rozłączanie z: %s', //hsDisconnecting
                                    'Rozłączony z: %s'); //hsDisconnected
begin
  Memo2.Lines.Add(Format(STATUS[Ord(AStatus)], [IdTCPclient1.Host]));
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1