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;