Entwickler-Ecke

Internet / Netzwerk - Hostnamen ermitteln


ardani - Di 09.02.10 16:27
Titel: Hostnamen ermitteln
http://www.delphi-forum.de/topic_Hostname+aus+IP+ermitteln_96970,0.html

habe das hier per suche gefunden, allerdings liefert das mir nicht das gewünschte Resultat,
ich bin auf der Suche nach dem Hostnamen und irgendwie habe ich das Gefühl die Funktion liefert mir "lediglich" den DNS eintag...
Ich habe damit Versucht von einem Rechner im Netz den Namen zu erhalten, angenommen der Rechner heißt "xyz" im DNS steht "blubb", dann liefert mir die Funktion "blubb" zurück und nicht "xyz", gibt es da eine möglichkeit, oder habe ich beim testen einen Fehler gemacht ?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
unit Unit2;

interface

uses Winsock, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, ScktComp;

  function IPv4ToNameThread(const IPv4ddn2: String; j: byte): String;

implementation

var
  WSAData: TWSAData;
  aus: string;
  IPv4ddn : string;

procedure IPv4ToName();
  var
    IPv4: in_addr;
    HostEnt: PHostEnt;
begin
  IPv4.S_addr := inet_addr(PAnsiChar(IPv4ddn));
  HostEnt := gethostbyaddr(@IPv4, SizeOf(IPv4), AF_INET);
  if Assigned(HostEnt) then
    aus := StrPas(Hostent^.h_name)
  else
    aus := '';
end;

function IPv4ToNameThread(const IPv4ddn2: String; j: byte): String;
var threadHandle:THandle;
    test:TThreadFunc;
begin
IPv4ddn := IPv4ddn2;
//    ThreadHandle := BeginThread(nil, 0,@IPv4ToName(buildedIP),nil, 0,id );
    ThreadHandle := createThread(nil0, @IPv4ToName,nil0, j);
    if ThreadHandle <> 0 then CloseHandle(ThreadHandle);
end;

initialization
  WSAStartup($101, WSAData); // der RC ist hoffentlich <> 0

finalization
  WSACleanup;

end.


habe es mir jetzt so zurecht gebaut, nur bekomme ich immer die Meldung:

[Error] Unit2.pas(36): Types of actual and formal var parameters must be identical

und weiß aber nicht wieso... Ich weiß schon was sie heißt, nur weiß ich nicht wo der Fehler liegen soll, egal wo ich nachgesehen habe, habe immer nur das gleiche gefunden...


Narses - Mi 10.02.10 21:47

Moin!

user profile iconardani hat folgendes geschrieben Zum zitierten Posting springen:
ich bin auf der Suche nach dem Hostnamen und irgendwie habe ich das Gefühl die Funktion liefert mir "lediglich" den DNS eintag...
So ist es, genau das tut diese API-Funktion.

user profile iconardani hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe damit Versucht von einem Rechner im Netz den Namen zu erhalten, angenommen der Rechner heißt "xyz" im DNS steht "blubb", dann liefert mir die Funktion "blubb" zurück und nicht "xyz", gibt es da eine möglichkeit, oder habe ich beim testen einen Fehler gemacht ?
Du machst IMHO einen logischen Fehler, da du von der häufig zutreffenden, aber nicht zwingenden Annahme ausgehst, dass sich ein Host beim DNS mit seinem Hostnamen registriert, oder das dieser Vorgang überhaupt automatisch abläuft. :idea:

Man kann einen Host auch manuell im DNS registrieren, sogar mehrfach (was der Code, den zu verwendest, übrigens nicht berücksichtigt). Der ReverseLookup-Call liefert nämlich ein Array von Hostnamen zurück, die unter dieser IP geführt werden.

Zusammengefasst: Wenn du den Hostnamen eines Rechners sicher ermitteln willst, geht das nur auf diesem Rechner selbst, da der Hostname und der DNS-Eintrag nicht zwingend zusammenhängen.

cu
Narses


Martok - So 14.02.10 05:42

In Windows-Netzen wird man wohl am ehesten den NetBIOS/WINS-Hostnamen wissen wollen.

Erklärt wird das ganze hier [http://articles.techrepublic.com.com/5100-10878_11-5034239.html] sehr schön.

Wissen willst du also das, was nbtstat -a IP so als UNIQUE Typ <00> ausspuckt.

Da gibts auch eine API-Funktion zu; irgendwo in der Library existiert da auch Code zu. Den finde ich aber grade nicht, müsstest gegebenenfalls mal selber graben, falls das das ist was du meinst.