Entwickler-Ecke

Internet / Netzwerk - IP-Adresse aus Hostnamen ermitteln (über DNS-Server)


Silas - So 27.08.06 09:08
Titel: IP-Adresse aus Hostnamen ermitteln (über DNS-Server)
Wie kann ich über den DNS-Server meines Providers die IP-Adresse eines Computers im Internet aus seinem Hostnamen (z.B. http://www.delphi-forum.de/) ermitteln - und das ganze in Delphi 3 Pro (ich bin ein unverbesserlicher Nostalgiker ;-))?


Silas - So 27.08.06 15:46

*umhilferuf* ;-)


Narses - So 27.08.06 23:04

Moin und :welcome: im Forum!

Schau mal hier [http://www.delphi-forum.de/viewtopic.php?t=53259&start=0&postdays=0&postorder=asc&highlight=], da gibt es die Funktionen GetIPByName, damit geht das. Ist allerdings nicht direkt für D3 geeignet, fürchte ich. Da du aber nur einen Wrapper für GetHostByName der WSA brauchst, solltest du das eigentlich leicht daraus ableiten können.

cu
Narses


Silas - Mo 28.08.06 09:33

Ich bekomm beim compilieren nur fünf Meter Compilerfehler angezeigt. Mein Delphi ist wahrscheinlich etwas zu vorsintflutlich :oops: . Kannst du mir die Funktion in eine DLL packen, das ich sie trotzem benutzen kann?

Danke!


chrisw - Mo 28.08.06 09:52

Ich benutze immer diese, kenne den Autor allerdings nicht !

Sollte auch unter D3 funktionieren:


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:
uses ...,winsock...

function GetIPFromHost (var HostName, IPaddr, WSAErr: string): Boolean;
type
  Name = array[0..100of Char;
  PName = ^Name;
var
  HEnt: pHostEnt;
  HName: PName;
  WSAData: TWSAData; 
  i: Integer; 
begin
  Result := False;
  if WSAStartup($0101, WSAData) <> 0 then begin
    WSAErr := 'Winsock is not responding."'
    Exit;
  end;
  IPaddr := ''
  New(HName);
  if GetHostName(HName^, SizeOf(Name)) = 0 then
  begin
    HostName := StrPas(HName^);
    HEnt := GetHostByName(HName^);
    for i := 0 to HEnt^.h_length - 1 do 
     IPaddr :=
      Concat(IPaddr,
      IntToStr(Ord(HEnt^.h_addr_list^[i])) + '.');
    SetLength(IPaddr, Length(IPaddr) - 1);
    Result := True;
  end
  else begin
   case WSAGetLastError of
    WSANOTINITIALISED:WSAErr:='WSANotInitialised';
    WSAENETDOWN      :WSAErr:='WSAENetDown';
    WSAEINPROGRESS   :WSAErr:='WSAEInProgress'
   end;
  end;
  Dispose(HName);
  WSACleanup;
end;


Silas - Mo 28.08.06 09:57

Welche Units muss ich für die Funktion einbinden? Mein Compiler kennt einen ganzen Haufen bezeichner nicht.


chrisw - Mo 28.08.06 09:59

eigentlich nur die winsock, wie im Beispiel !!


Silas - Mo 28.08.06 10:02

Extrem-Blamage für mich: Ich hab die uses-Zeile übersehn... :oops: :oops:
Vielen Dank für die Funktion!


Silas - Mo 28.08.06 10:30

Ich geh mal davon aus, dass ich einfach zu dumm bin, aber ich bekomm grundsätzlich meine eigene IP zurück (nicht die 127.0.0.1, sondern meine IP im Netz), egal welchen Hostnamen ich an die Funktion übergeb.
Ich hab an HostName einen Internetadresse übergeben (z.B. http://www.delphi-forum.de/), und dann die Adresse aus IPAddr ausgelesen. Die Error-Var war immer leer.


Martok - Mo 28.08.06 12:07

Das ist auch irgendwie der Sinn der Funktion. Sie holt immer zuerst den eigenen Hostname (GetHostName).
Wenn du statt dieser Zeile den Inhalt von Hostname in die HName-Variable kopierst, sollte es gehen. Dann allerdings auch dafür sorgen, dass Hostname kein var-parameter ist.

Achso, und: Hostnamen haben kein Protokoll, richtig wäre also http://www.delphi-forum.de (ohne HTTP://)

HTH,
Martok


chrisw - Mo 28.08.06 13:46

OK, mein Fehler !

Hier hab ich die function mal umgebaut


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:
uses ... winsock..


function GetIPFromHostname (HostName : String): String;
type
  Name =array[0..254of Char;
  PName = ^Name;
var
  HEnt: pHostEnt;
  HName: PName;
  WSAData: TWSAData;
  i: Integer;
begin
  Result := '';
  if WSAStartup($0101, WSAData) <> 0 then Exit;
  New(HName);
  StrPCopy(PChar(HName),HostName);
  HEnt := GetHostByName(HName^);
  for i := 0 to HEnt^.h_length - 1 do
  Result :=
  Concat(Result,IntToStr(Ord(HEnt^.h_addr_list^[i])) + '.');
  SetLength(Result, Length(Result) - 1);
  Dispose(HName);
  WSACleanup;
end;


Silas - Mo 28.08.06 14:41

Danke, jetzt funktioniert's.

@Matrok: Danke für den Hinweis!