Namensauflösung hostname - IP-Nummer

Alle Fragen zur Netzwerkkommunikation
Antworten
sigvdr
Beiträge: 4
Registriert: Di 5. Feb 2008, 12:39

Namensauflösung hostname - IP-Nummer

Beitrag von sigvdr »

Hallo zusammen,

ich möchte mich zunächst einmal als Neuling in diesem Forum und als Neuling in der Verwendung von Lazarus outen.
Ich habe mir heute auf Windows und Ubuntu7.10 das Lazaruspaket installiert (0.9.24) und
als erste Anwendung einen Miniatur-TCP-Client gebastelt. Dazu habe ich die Komponente
"sockets" installiert ( was mich schon die meiste Zeit gekostet hat ).

Der TCP-Client läuft auch schon ( unter WIN und Linux ), allerdings muss ich bei dem SocketClient die IP-Adresse verwenden und kann nicht den Hostnamen verwenden.

Im Moment fehlt mir jede Idee, wie ich den Hostnamen in eine IP-Adresse umsetzen kann.


Gruß Sig

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

In der Konsole:

Code: Alles auswählen

ping Hostname


als Resultat solltest du die ZielIP sehen.

Wenn du es natürlich Programmseitig machen willst, gibts sicher auch eigene Routinen, ich denk mal, Synapse, Indy usw. können irgendwie Hostnamen aufgelöst zurückgeben.
Johannes

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »


sigvdr
Beiträge: 4
Registriert: Di 5. Feb 2008, 12:39

Beitrag von sigvdr »

Hallo,

ich die Umsetzung soll natürlich vom Programm aus erfolgen, aus einer Eingabe von wahlweise dem Hostnamen oder der IP-Nummer.

Ich suche so etwas wie "gethostbyname" .

Gruß Sig

sigvdr
Beiträge: 4
Registriert: Di 5. Feb 2008, 12:39

Beitrag von sigvdr »

Hallo,

da habe ich doch noch was gefunden: ist also erledigt.


Function Name2IPNum(name: string): Longint;
var
{$IFDEF Linux}
MyHost: THost;
{$ENDIF}
{$IFDEF Win32}
MyHost: winsock.PHostEnt;
MyWSAData: winsock.WSAData;
p: Pointer;
{$ENDIF}

begin
{$IFDEF Linux}
MyHost.NameLookup(name);
Name2IPNum:=(Myhost.IPAddress[4] shl 24)+(Myhost.IPAddress[3] shl 16)+(Myhost.IPAddress[2] shl 8)+Myhost.IPAddress[1];
{$ENDIF}
{$IFDEF Win32}
name:=name+#0;
if WSAStartup(1, MyWsaData)=0 then begin
MyHost:=winsock.gethostbyname(@name[1]);
if MyHost<>nil then begin
p:=Pointer(MyHost^.h_addr_list^);
Name2IPNum:=longint(p^);
end else
Name2IPNum:=0;
end else
Name2IPNum:=0;
{$ENDIF}
end;

function GetIPString(lAdr:longint):String;
begin
result := IntToStr(lAdr and $000000FF)+'.'+IntToStr((lAdr and $0000FF00) shr 8)+'.'+
IntToStr((lAdr and $00FF0000) shr 16)+'.'+IntToStr((lAdr and $FF000000) shr 24);
end;

function GetHostByName(sAdr:String):String;
begin
result := GetIPString(Name2IPNum(sAdr));
end;


Gruß Sig

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Wenn du's kompliziert magst.... ;-)

Ansonsten: http://synapse.ararat.cz/

sigvdr
Beiträge: 4
Registriert: Di 5. Feb 2008, 12:39

Beitrag von sigvdr »

Hallo nocheinmal,

nach dem die Lösung von oben nicht unter Linux sondern nur unter Windows funktioniert hatte,
habe ich noch einmal nachgeforscht und dabei die unit "resolve" gefunden. Damit gehts unter Windows + Linux:

Code: Alles auswählen

uses resolve;
..
..
..
function GetHostByName(HostName:String):String;
var
  host:THostResolver;
begin
  host := THostResolver.Create(nil);
  if host.NameLookup(HostName) then
     result := host.AddressAsString
   else
     result := '';
  host.Free;
end;



@theo
synapse scheint mir ein wenig zu kompliziert und umfangsreich für meine MiniApplication.

Gruß Sig

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

sigvdr hat geschrieben:@theo
synapse scheint mir ein wenig zu kompliziert und umfangsreich für meine MiniApplication.


Naja, das musst du selber entscheiden.
Komplizierter als was du da alles "erforschst" ist es aber mit Sicherheit nicht.
Und bzgl. umfangreich: Du musst ja nix installieren. Du brauchst für deinen Fall nur die Unit blcksock und dort die Klasse TTCPBlockSocket
http://synapse.ararat.cz/doc/help/blcks ... ocket.html
Das nimmt dir viel Arbeit ab und läuft dann auch gleich auf Windows / Linux und
Lazarus / Delphi
Aber wie gesagt, entscheide selber.

Antworten