Einzelnen Beitrag anzeigen

Kamil

Registriert seit: 17. Aug 2002
178 Beiträge
 
#11

Re: Internet IP herausfinden...

  Alt 6. Nov 2003, 17:23
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;
  Mit Zitat antworten Zitat