Thema: Delphi ICMP Problem

Einzelnen Beitrag anzeigen

Benutzerbild von LoW_FloW
LoW_FloW

Registriert seit: 29. Nov 2003
117 Beiträge
 
Delphi 7 Professional
 
#1

ICMP Problem

  Alt 8. Mai 2004, 09:16
Guten Morgen erst einmal . Ich bin grade dabei ein Programm zu gestalten, dass bei nicht erreichen eines Hosts diesen Host in eine ListBox schreibt. Bei IP-Adressen geht das soweit (z.B. 192.168.0.99). Verwendet man nun aber Namen (kA wie die heißen, DNS glaub ich), gibt es Probleme, denn er meldet immer:
Socket-Fehler
Host nicht gefunden

Ich will diese Nachricht unterdrücken und stattdessen, die IP auf die ListBox der Unerreichbaren setzten.
Hier sind die Stellen, auf die es ankommen (denke ich ):
Delphi-Quellcode:
var
  frmMain: TfrmMain;
  ini: TIniFile;
  PC : Array of String ;
  Anzahl : integer = 0 ;
  current_PC : integer ;
  available_PC : Array of String ;
  unavailable_PC : Array of String ;

implementation

{$R *.dfm}

procedure Newsort ;
var
i : integer ;
begin
frmMain.lstErreichbar.Items.Clear ;
frmMain.lstUnerreich.Items.Clear ;
frmMain.lstErreichbar.Items.Add(IntToStr(length(available_PC)));
frmMain.lstUnerreich.Items.Add(IntToStr(length(unavailable_PC)));
{
for i := 1 to high(available_PC) do
  frmMain.lstErreichbar.Items.Add(available_PC[i]) ;
for i := 1 to high(unavailable_PC) do
  frmMain.lstUnerreich.Items.Add(unavailable_PC[i]);
}

end;

procedure TfrmMain.ICMPReply(ASender: TComponent; const ReplyStatus: TReplyStatus);
var
  TempString: string ;
begin
  if ReplyStatus.BytesReceived = 0 then begin
    SetLength(unavailable_PC, Length(unavailable_PC)+1) ;
    unavailable_PC[High(unavailable_PC)] := PC[current_PC];
    end
  else begin
    TempString := ReplyStatus.FromIpAddress ;
    if TempString = '0.0.0.0then begin
      SetLength(unavailable_PC, Length(unavailable_PC)+1) ; //Variable verlängern
      unavailable_PC[High(unavailable_PC)] := PC[current_PC]; //Neusten Wert auslesen
    end
    else begin
      SetLength(available_PC, Length(available_PC)+1) ;
      available_PC[High(available_PC)] := PC[current_PC];
    end;
  end;
  Newsort ;
end;

procedure TfrmMain.btnPingClick(Sender: TObject);
var
  i: integer;
begin
  SetLength(available_PC , 0) ;
  SetLength(unavailable_PC, 0) ;
  ICMP.OnReply := ICMPReply ;
  btnPing.Enabled := false ;
    try
      for i := 1 to Anzahl do begin
        current_PC := i ;
        ICMP.Host := PC[i] ;
        ICMP.Ping ;
      end;
    finally
      btnPing.Enabled := true ;
  end;
end;
Will sich jemand nicht durch den Code wuseln, kann er auch nur sagen, wie man die Socket-Fehler Nachricht unterdrückt oder die Nachricht "abfängt" um den PC in die Inaktive Liste zu schreben
  Mit Zitat antworten Zitat