Entwickler-Ecke

Internet / Netzwerk - Rechnername über IP-Adresse...


FriFra - Sa 17.05.03 11:39
Titel: Rechnername über IP-Adresse...
Das Thema gab es zwar schon 1000 Mal, aber das Beispiel:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  function IPAddrToName(IPAddr: string): string;
  var
    SockAddrIn: TSockAddrIn;
    HostEnt: PHostEnt;
    WSAData: TWSAData;
  begin
    WSAStartup($101, WSAData);
    SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));
    HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
    if HostEnt <> nil then
      Result := StrPas(Hostent^.h_name)
    else
      Result := '';
  end;


ist extreem langsam :evil:

Gibt es nicht eine performantere Lösung, z.B. ein Table mit allen bekannten Hosts, inkl. IP's aus welchem man dann den entspr. Eintrag zurückgibt?
Die o.g. Funktion benötigt jedenfalls z.T. mehrere Sekunden, vor allem dann, wenn kein Hostname verfügbar ist! Ausserdem kann diese Funktion keine Namn von Printservern auflösen, was Windows selbst aber hinbekommt (Netzwerkumgebung!)...


cirrus - Mo 26.05.03 01:14

eine performantere Lösung wirst du wohl nicht finden, der code greift direkt auf die winsock schnittstelle zu.


FriFra - Mo 26.05.03 01:31

Ich habe die Sache jetzt anders gelöst... Ich Rufe "net view" captured auf und filtere aus dem resultierenden Text alle Rechnernamen, diese Pinge ich dann kurz an um die IP aufzulösen. Allein das Ausführen von "net view" und der anschliessende Ping sind schon wesentlich schneller als die o.g. Funktion. Auserdem versuche ich nun nicht Rechnernamen zu bekommen wo keine sind, denn dabei hängt die Funktion etwas...

Da aber "net" sofort alle Rechnernamen auflisten kann, muss es eigentlich noch eine elegantere Lösung geben.

Ausserdem liefert die Funktion auch alle "Rechnernamen" über die hosts-Datei, welche u.U. nicht mit den tatsächlichen Namen im Intranet übereinstimmen, schon deshalb ist "net" besser...