AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Lokale IP(s) ermitteln

Ein Thema von CalganX · begonnen am 31. Jan 2003 · letzter Beitrag vom 31. Jan 2003
Antwort Antwort
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#1

Lokale IP(s) ermitteln

  Alt 31. Jan 2003, 11:51
Es gibt verschiedene Möglichkeiten die IP eines Rechners zu ermitteln. Die beste ist wohl die über die Unit WinSock:
Delphi-Quellcode:
uses {...}, WinSock;
{...}
function LocalIP:string;
var
  WSA : TWSAData;
  ILen : integer;
  PHst : PChar;
  PHEn : PHostEnt;
begin
  WSAStartup( $0101, WSA );
  ILen := $FF;
  PHst := StrAlloc( ILen );
  gethostname( PHst, ILen );
  PHEn := gethostbyname( PHst );

  with PHEn^ do result:=format(
   '%d.%d.%d.%d',
   [ord(h_addr^[ 0 ]), ord(h_addr^[ 1 ]),
   ord(h_addr^[ 2 ]), ord(h_addr^[ 3 ])]
  );

  {Nuke the string}
  StrDispose( PHst );

  {Dust and Clean}
  WSACleanup;

end;
Chris

[edit=Chakotay1308]Den Titel angepasst. Mfg, Chakotay1308[/edit]
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#2
  Alt 31. Jan 2003, 12:57
Als Anregung:
Code:
gethostname( PHst, ILen );
ist eigentlich nutzlos. Da es um die lokale IP geht, reicht:
Code:
PHEn := gethostbyname( [b]NIL[/b] );
Das Formatieren der Adresse kannst du auch einfacher mit
Code:
inet_ntoa
haben.

Und dann vermisse ich diverse kleine Schutzmechanismen.
Was, wenn das Initialisieren der WinSock in die Hose geht?
Was, wenn die o.g. Funktion dummerweise nichts zurückgibt?

Bitte ausbessern.
So würde ich das nicht in die FAQs aufnehmen.

Sorry, is´ aber so!
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#3
  Alt 31. Jan 2003, 13:21
Da unser Chak-o-tay ab und zu bei www.ensacom.de Tipps veröffentlicht, habe ich mal von dort die IP-Funktion abgeschrieben (mehr oder weniger ):
Delphi-Quellcode:
uses
  WinSock;

function GetLocalIPs: string;
type
  PPInAddr = ^PInAddr;
var
  wsadata : TWSAData;
  hostinfo : PHostEnt;
  addr : PPInAddr;
begin
  Result := '';

  if(WSAStartUp(MAKEWORD(1,1),wsadata) = 0) then
  try
    hostinfo := gethostbyname(nil);
    if(hostinfo <> nil) then begin
      addr := pointer(hostinfo^.h_addr_list);

      while(addr^ <> nil) do begin
        Result := Result + inet_ntoa(addr^^) + ^M^J;
        inc(addr);
      end;
    end;
  finally
    WSACleanUp;
  end;
end;
Warum?
Weil sie -laut Beschreibung!- alle IPs zurückliefert. Mangels LAN kann ich das im Moment zwar nicht prüfen, aber ich vertraue einfach mal darauf, dass bei ensacom kein Blödsinn steht. (Wer ein LAN hat bzw. eine eingebaute Netzwerkkarte, kann´s ja mal fix testen und Bescheid sagen.)


Übrigens: MAKEWORD(1,1) ist das selbe wie $0101. Ich finde es nur lesbarer, weil man die Versionsnummer ohne viel Rumraten erkennt und einstellen kann. Ohne groß zu Überlegen: wie würde man hexadezimal die Version 2.0 angeben? Wer jetzt gedacht hat $0200 liegt leider falsch. Anders herum wäre richtig: $0002; da das niederwertige Byte die Hauptversionsnummer angibt.

So ein Missgeschick kann mit MAKEWORD(2,0) nicht geschehen.

Kann man im PSDK zu "WSAStartup" nachlesen.
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz