Skip to content

3 maneras de obtener una IP Local

En muchos sistemas multiusuarios, por no decir casi todos, es necesario obtener la IP local donde se ejecuta nuestra aplicación.

En este articulo, quiero enseñarles 3 maneras diferentes de obtener la dirección IP Local en una aplicación VCL.

Estoy ejemplos están probados en RAD Studio Delphi 10.4.1 Sídney, pero n quiere decir que en versiones anteriores no funcione.

Veamos los códigos:

1 – Utilizando el componente TIdIPWatch Indy

El componente TIdIPWatch de la paleta Indy Component, está diseñado para realizar un monitoreo en tiempo real de cualquier cambio en la IP del sistema donde se ejecuta la aplicación.

Con este componente no solo podemos obtener la dirección IP del equipo, si no realizar un monitoreo de IP dinámicas obteniendo el historial de las diferentes IP guardadas en el mismo componente.

En este ejemplo, lo utilizamos solo para la obtención de la IP con la que cuenta el equipo en este momento.

Uses
  IdBaseComponent, IdComponent, IdIPWatch;

...

function GetIPLocal: string;
var
   LocalIP: TIdIPWatch;
begin
  LocalIP := TIdIPWatch.Create(nil);
  try
    if LocalIP.LocalIP.Length > 0 then
      Result := LocalIP.LocalIP;
  finally
    LocalIP.Free;
  end;
end;

2 – Utilizando la unidad Winsock

Winsock utiliza la API de windows Sockets para poder obtener la IP Local.

Esta unidad se utiliza generalmente, en los sistemas Cliente / Servidor para la transmisión de datos.

Uses
  Winsock;

...

function GetIPLocal: string;
type
  TaPInAddr = array [0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  Buffer: array [0..63] of Ansichar;
  i: Integer;
  GInitData: TWSADATA;
begin
  WSAStartup($101, GInitData);
  Result := '';
  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 := StrPas(inet_ntoa(pptr^[i]^));
    Inc(i);
  end;
  WSACleanup;
end;

3 – Utilizando TIdStack Indy

Este es un ejemplo un poco diferente, ya que TIdStack es una clase abstracta, y por ende no la podemos instanciar directamente.

Para obtener la IP Local con esta clase, deberemos utilizar la variable global GStack.

Para utilizar la variable GStack, solo debemos llamar a la clase TIdStack.IncUsage() como se lo mostramos en el siguiente ejemplo:

Uses
  IdStack;

...

function GetIPLocal: string;
begin
  TIdStack.IncUsage;
  try
    Result := GStack.LocalAddress;
  finally
    TIdStack.DecUsage;
  end;
end;