![]() |
Lokale IP(s) ermitteln
Es gibt verschiedene Möglichkeiten die IP eines Rechners zu ermitteln. Die beste ist wohl die über die Unit WinSock:
Delphi-Quellcode:
Chris
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; [edit=Chakotay1308]Den Titel angepasst. Mfg, Chakotay1308[/edit] |
Als Anregung:
Code:
ist eigentlich nutzlos. Da es um die lokale IP geht, reicht:
gethostname( PHst, ILen );
Code:
Das Formatieren der Adresse kannst du auch einfacher mit
PHEn := gethostbyname( [b]NIL[/b] );
Code:
haben.
inet_ntoa
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! |
Da unser Chak-o-tay ab und zu bei
![]()
Delphi-Quellcode:
Warum?
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; 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz