Newsgroup: it.comp.lang.delphi
Titolo: Trovare l' IP

Quando mi connetto a Internet il provider mi da un IP.
E' possibile trovarlo usando i componenti ClientSocket e ServerSocket?
Grazie.

 E' possibile trovarlo usando i componenti ClientSocket e ServerSocket?
Ho preparato una unit (vedi piu' in basso) per ricavare IP e molte altre
informazioni... Puoi creare una finestra con molte info dettagliate:
procedure TMiaForm.MostraInformazioniDiRete(Sender: TObject);
var
  FinestraInfo: TInfoRete;
begin
  FinestraInfo := TInfoRete.Create(Application);
  try
    // Mostra le informazioni relative alla rete
    FinestraInfo.ShowModal;
  finally
    FinestraInfo.Free;
   end;
end;
Oppure limitarti a chiamare la funzione:
MioIp:=OttieniIp(NomeDominio);
dove MioIp e' una variabile di tipo string.
Copia e incolla il codice seguente in un file di testo chiamato
infounit.pas:
-----------------------------------------------------------
unit InfoUnit;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;
type
  TInfoRete = class(TForm)
    BitBtn1: TBitBtn;
    ReteMemo: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    procedure ParametriRete;
    procedure InformazioniAdattatore;
  public
  end;
var
  InfoRete: TInfoRete;
function NomeDominio: string;
function OttieniIp(const NomeHost: string): string;
implementation
uses Winsock;
{$R *.dfm}
// Strutture necessarie x accedere alle funzioni della libreria iphlpapi.dll
const
  MAX_HOSTNAME_LEN = 128; { da IPTYPES.H }
  MAX_DOMAIN_NAME_LEN = 128;
  MAX_SCOPE_ID_LEN = 256;
  MAX_ADAPTER_NAME_LENGTH = 256;
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
  MAX_ADAPTER_ADDRESS_LENGTH = 8;
type
  TIPAddressString = array[0..4 * 4 - 1] of char;
  PIPAddrString = ^TIPAddrString;
  TIPAddrString = record
    Next: PIPAddrString;
    IPAddress: TIPAddressString;
    IPMask: TIPAddressString;
    Context: integer;
  end;
  PFixedInfo = ^TFixedInfo;
  TFixedInfo = record { FIXED_INFO }
    HostName: array[0..MAX_HOSTNAME_LEN + 3] of char;
    DomainName: array[0..MAX_DOMAIN_NAME_LEN + 3] of char;
    CurrentDNSServer: PIPAddrString;
    DNSServerList: TIPAddrString;
    NodeType: integer;
    ScopeId: array[0..MAX_SCOPE_ID_LEN + 3] of char;
    EnableRouting: integer;
    EnableProxy: integer;
    EnableDNS: integer;
  end;
  PIPAdapterInfo = ^TIPAdapterInfo;
  TIPAdapterInfo = record { IP_ADAPTER_INFO }
    Next: PIPAdapterInfo;
    ComboIndex: integer;
    AdapterName: array[0..MAX_ADAPTER_NAME_LENGTH + 3] of char;
    Description: array[0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of char;
    AddressLength: integer;
    Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
    Index: integer;
    _Type: integer;
    DHCPEnabled: integer;
    CurrentIPAddress: PIPAddrString;
    IPAddressList: TIPAddrString;
    GatewayList: TIPAddrString;
    DHCPServer: TIPAddrString;
    HaveWINS: Bool;
    PrimaryWINSServer: TIPAddrString;
    SecondaryWINSServer: TIPAddrString;
    LeaseObtained: integer;
    LeaseExpires: integer;
  end;
  // Parametri di rete
function GetNetworkParams(FI: PFixedInfo; var BufLen: integer): integer;
  stdcall; external 'iphlpapi.dll' Name 'GetNetworkParams';
// Parametri dell'adattatore
function GetAdaptersInfo(AI: PIPAdapterInfo; var BufLen: integer): integer;
  stdcall; external 'iphlpapi.dll' Name 'GetAdaptersInfo';
// Imposta la lunghezza di una stringa (compatibilità API Windows)
procedure StrResetLength(var S: AnsiString);
begin
  SetLength(S, StrLen(PChar(S)));
end;
function NomeUtenteDominio(const CurUser: string): string;
var
  Contatore1, Contatore2: DWORD;
  Sd: PSecurityDescriptor;
  Snu: SID_Name_Use;
begin
  Contatore1 := 0;
  Contatore2 := 0;
  Sd := nil;
  Snu := SIDTypeUser;
  // Restituisce le informazioni relative alla sicurezza
  LookUpAccountName(nil, PChar(CurUser), Sd, Contatore1, PChar(Result),
Contatore2, Snu);
  SetLength(Result, Contatore2 + 1);
  // Alloca la memoria necessaria per la chiamata successiva
  Sd := AllocMem(Contatore1);
  try
    if LookUpAccountName(nil, PChar(CurUser), Sd, Contatore1, PChar(Result),
      Contatore2, Snu) then
      StrResetLength(Result)
    else
      Result := EmptyStr;
  finally
    FreeMem(Sd);
   end;
end;
// Stringa di identificazione dell'utente locale
function UtenteLocale: string;
var
  Contatore: DWORD;
begin
  Contatore := 256 + 1; // UNLEN + 1
  SetLength(Result, Contatore);
  GetUserName(PChar(Result), Contatore);
  StrResetLength(Result);
end;
// Per ottenere l'IP dobbiamo conoscere il nome del dominio di UtenteLocale
function NomeDominio: string;
begin
  Result := NomeUtenteDominio(UtenteLocale);
end;
// Questa è la funzione richiamata dal programma
function OttieniIP(const NomeHost: string): string;
var
  R: integer;
  WSAData: TWSAData;
  HostEnt: PHostEnt;
  Host: string;
  SockAddr: TSockAddrIn;
begin
  Result := '';
  // Avvia lo stack Winsock 1.1
  R := WSAStartup(MakeWord(1, 1), WSAData);
  // Se l'operazione è andata a buon fine:
  if R = 0 then
    try
      Host := NomeHost;
      if Host = '' then
       begin
        SetLength(Host, MAX_PATH);
        // Nome host standard per la macchina locale
        GetHostName(PChar(Host), MAX_PATH);
       end;
      // Restituisce in HostEnt le informazioni su Host
      HostEnt := GetHostByName(PChar(Host));
      if HostEnt <> nil then
       begin
        SockAddr.sin_addr.S_addr :=
longint(PLongint(HostEnt^.h_addr_list^)^);
        // Converti un indirizzo di rete nella forma xxx.xxx.xxx.xxx (è
l'inversa di inet_addr)
        Result := inet_ntoa(SockAddr.sin_addr);
       end;
    finally
      WSACleanup;
     end;
end;
procedure TInfoRete.FormCreate(Sender: TObject);
begin
  ParametriRete;
  InformazioniAdattatore;
end;
procedure TInfoRete.InformazioniAdattatore;
var
  AI, Work: PIPAdapterInfo;
  Size: integer;
  Res: integer;
  I: integer;
  function MACToStr(ByteArr: PByte; Len: integer): string;
   begin
    Result := '';
    while (Len > 0) do
     begin
      Result := Result + IntToHex(ByteArr^, 2) + '-';
      ByteArr := Pointer(integer(ByteArr) + SizeOf(byte));
      Dec(Len);
     end;
    SetLength(Result, Length(Result) - 1); { remove last dash }
   end;
  function GetAddrString(Addr: PIPAddrString): string;
   begin
    Result := '';
    while (Addr <> nil) do
     begin
      Result := Result + 'A: ' + Addr^.IPAddress + ' M: ' + Addr^.IPMask +
#13;
      Addr := Addr^.Next;
     end;
   end;
  function TimeTToDateTimeStr(TimeT: integer): string;
  const
    UnixDateDelta = 25569; { days between 12/31/1899 and 1/1/1970 }
  var
    DT: TDateTime;
    TZ: TTimeZoneInformation;
    Res: DWord;
   begin
    if (TimeT = 0) then Result := ''
    else
     begin
      { Unix TIME_T is secs since 1/1/1970 }
      DT := UnixDateDelta + (TimeT / (24 * 60 * 60)); { in UTC }
      { calculate bias }
      Res := GetTimeZoneInformation(TZ);
      if (Res = TIME_ZONE_ID_INVALID) then RaiseLastOSError;
      if (Res = TIME_ZONE_ID_STANDARD) then
       begin
        DT := DT - ((TZ.Bias + TZ.StandardBias) / (24 * 60));
        Result := DateTimeToStr(DT) + ' ' +
WideCharToString(TZ.StandardName);
       end
      else
       begin { daylight saving time }
        DT := DT - ((TZ.Bias + TZ.DaylightBias) / (24 * 60));
        Result := DateTimeToStr(DT) + ' ' +
WideCharToString(TZ.DaylightName);
       end;
     end;
   end;
begin
  Size := 5120;
  GetMem(AI, Size);
  Res := GetAdaptersInfo(AI, Size);
  if (Res <> ERROR_SUCCESS) then
   begin
    SetLastError(Res);
    RaiseLastOSError;
   end;
  with ReteMemo.Lines do
   begin
    Work := AI;
    I := 1;
    repeat
      Add('');
      Add('Dispositivo ' + IntToStr(I));
      Add('  Indice combinato: ' + IntToStr(Work^.ComboIndex));
      Add('  Nome adattatore: ' + Work^.AdapterName);
      Add('  Descrizione: ' + Work^.Description);
      Add('  Indirizzo adattatore: ' + MACToStr(@Work^.Address,
Work^.AddressLength));
      Add('  Indice: ' + IntToStr(Work^.Index));
      Add('  Tipo: ' + IntToStr(Work^._Type));
      Add('  DHCP: ' + IntToStr(Work^.DHCPEnabled));
      Add('  IP corrente: ' + GetAddrString(Work^.CurrentIPAddress));
      Add('  Indirizzi IP: ' + GetAddrString(@Work^.IPAddressList));
      Add('  Gateways: ' + GetAddrString(@Work^.GatewayList));
      Add('  Server DHCP: ' + GetAddrString(@Work^.DHCPServer));
      Add('  WINS: ' + IntToStr(integer(Work^.HaveWINS)));
      Add('  WINS primario: ' + GetAddrString(@Work^.PrimaryWINSServer));
      Add('  WINS secondario: ' +
GetAddrString(@Work^.SecondaryWINSServer));
      Add('  Lease ottenuto: ' + TimeTToDateTimeStr(Work^.LeaseObtained));
      Add('  Scadenza Lease: ' + TimeTToDateTimeStr(Work^.LeaseExpires));
      Inc(I);
      Work := Work^.Next;
    until (Work = nil);
   end;
  FreeMem(AI);
end;
procedure TInfoRete.ParametriRete;
var
  FI: PFixedInfo;
  Size: integer;
  Res: integer;
  I: integer;
  DNS: PIPAddrString;
begin
  Size := 1024;
  GetMem(FI, Size);
  Res := GetNetworkParams(FI, Size);
  if (Res <> ERROR_SUCCESS) then
   begin
    SetLastError(Res);
    RaiseLastOSError;
   end;
  with ReteMemo.Lines do
   begin
    Clear;
    Add('Nome Host: ' + FI^.HostName);
    Add('Nome Dominio: ' + FI^.DomainName);
    if (FI^.CurrentDNSServer <> nil) then
      Add('Server DNS corrente: ' + FI^.CurrentDNSServer^.IPAddress)
    else
      Add('Server DNS corrente: (nessuno)');
    I := 1;
    DNS := @FI^.DNSServerList;
    repeat
      Add('DNS ' + IntToStr(I) + ': ' + DNS^.IPAddress);
      Inc(I);
      DNS := DNS^.Next;
    until (DNS = nil);
    Add('ID visibilità: ' + FI^.ScopeId);
    Add('Routing: ' + IntToStr(FI^.EnableRouting));
    Add('Proxy: ' + IntToStr(FI^.EnableProxy));
    Add('DNS: ' + IntToStr(FI^.EnableDNS));
   end;
  FreeMem(FI);
end;
end.

 Grazie.
Con quei componenti non so, ma sulle FAQ c'e' una procedurina piccola
piccola che ti trova l'ip