Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Internet IP herausfinden... (https://www.delphipraxis.net/11433-internet-ip-herausfinden.html)

Kamil 6. Nov 2003 16:23

Re: Internet IP herausfinden...
 
Die Funktion GetIpAddress von Daniel beachtet nicht, dass GetHostByName mehrere IP Adressen zurückliefern kann. Das Ergebnis leifert nur die erste IP Adresse in der Liste.

Versuchs mal damit:
-GetIPs liefert dir ne Liste mit allen IP Adressen des PCs
-GetInetIP versucht die Adresse der Verbindung, die das point-to-point Protokol verwendet (dieses Protokol wird von den meisten Provider verwendet) zu holen. Falls das nicht klappt (also keine PPP Verbindung da ist) wird die erste(*) IP von GetIPs zurückgeliefert. Somit hat man schon mit einer hohen Wahrscheinlichkeit die richtige IP.

(*)Du könntest die Funktion noch erweitern:
GetInetIP könnte noch alle lokalen IP Adressen, die GetIPs liefert, rausfiltern.
Und falls das alle IPs entfernen würde, dann könntest du noch die www.whatsmyip.com Version noch einbauen.

Delphi-Quellcode:
function GetIPs: TStrings;
type
  TaPInAddr = array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  Buffer: array[0..63] of Char;
  I: Integer;
  GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  Result := TstringList.Create;
  Result.Clear;
  GetHostName(Buffer, SizeOf(Buffer));
  phe := GetHostByName(buffer);
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  I   := 0;
  while pPtr^[I] <> nil do
  begin
    Result.Add(inet_ntoa(pptr^[I]^));
    Inc(I);
  end;
  WSACleanup;
end;

function GetInetIP: string;
var
  IpHlpModule: THandle;
  GetAdaptersInfo: function (pAdapterInfo: PTIP_ADAPTER_INFO; pOutBufLen: PULONG): DWORD; stdcall;
  pAdapterInfo, old: PTIP_ADAPTER_INFO;
  len: integer;
begin
  try
    result:=GetIPs[0];
  except
    result:='0.0.0.0';
  end;
  IpHlpModule:=LoadLibrary(IpHlpDLL);
  try
    if IpHlpModule=0 then
    begin
      exit;
    end;
    GetAdaptersInfo:=GetProcAddress(IpHlpModule, 'GetAdaptersInfo');
    getmem(pAdapterInfo, sizeof(TIP_ADAPTER_INFO));
    old:=pAdapterInfo;
    try
      len:=sizeof(TIP_ADAPTER_INFO);
      GetAdaptersInfo(pAdapterInfo, @len);
      result:=pAdapterInfo^.IPAddressList.IpAddress;
      while pAdapterInfo<>nil do
      begin
        if pAdapterInfo^.aType=IF_PPP_ADAPTERTYPE then
          result:=pAdapterInfo^.IPAddressList.IpAddress;
        pAdapterInfo:=pAdapterInfo.Next;
      end;
    finally
      freemem(old);
    end;
  finally
    if IpHlpModule<>0 then
    begin
      FreeLibrary(IpHlpModule);
    end;
  end;
end;

hircusmutzus 6. Nov 2003 16:33

Re: Internet IP herausfinden...
 
Hi,
erst mal danke für die ausführliche Hilfe!!! Das funktioniert teilweise: Die erste Funktion (GetIPs) liefert mir beide Adressen. Bei der zweiten Fkt. nennt mir der Compiler nur einige Fehler (z.B. kennt er eine function nicht...) - keine ahnung aber eigtentlich auch egal, denn die 1. Methode funktioniert ja!!!

MfG Matthias Volland

Kamil 6. Nov 2003 16:41

Re: Internet IP herausfinden...
 
weil folgendes fehlt:
Code:
type
  TIP_ADDRESS_STRING = array[0..15] of char;

  PTIP_ADDR_STRING = ^TIP_ADDR_STRING;
  TIP_ADDR_STRING = packed record
    Next: PTIP_ADDR_STRING;
    IpAddress: TIP_ADDRESS_STRING;
    IpMask: TIP_ADDRESS_STRING;
    Context: DWORD;
  end;

  PTIP_ADAPTER_INFO = ^TIP_ADAPTER_INFO;
  TIP_ADAPTER_INFO = packed record
    Next: PTIP_ADAPTER_INFO;
    ComboIndex: DWORD;
    AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char;  
    Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char;  
    AddressLength: UINT;
    Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;    
    Index: DWORD;
    aType: UINT;
    DHCPEnabled: UINT;
    CurrentIPAddress: PTIP_ADDR_STRING;
    IPAddressList: TIP_ADDR_STRING;
    GatewayList: TIP_ADDR_STRING;
    DHCPServer: TIP_ADDR_STRING;
    HaveWINS: BOOL;
    PrimaryWINSServer: TIP_ADDR_STRING;
    SecondaryWINSServer: TIP_ADDR_STRING;
    LeaseObtained: LongInt ;
    LeaseExpires: LongInt;
    SpareStuff: array [1..2000] of char ;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr.
Seite 2 von 2     12   

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