En artículos anteriores, enseñamos 3 maneras diferentes de como obtener la IP de una PC, pero recientemente me surgió un desafío.
En un nuevo proyecto, necesitaba desarrollar un Server Proxy para instalarlo en un ordenador con 4 placas de red de las cuales 2 estaban conectadas a diferentes conexiones de internet. En dicho Server Proxi, tenía que hacerle seleccionar al usuario desde que conexión se tomaría internet para su distribución a través del proxy.
En base a que conocía la forma de obtener la IP de un ordenador, comencé a investigar como podría obtener todas las IP, si es que poseía más de una.
En los componentes Indy, instalados por defecto en Delphi, poseemos una gran cantidad de componentes y unidades que manejas todo tipo de conexiones. Una de estas unidades es IdStack, que posee la clase TIdStack con la cual vamos a obtener todas las IP del dispositivo.
La función para obtener todas las IP de una PC es la siguiente:
Uses IdStack, IdGlobal;
procedure GetAllIP();
var
LList: TIdStackLocalAddressList;
LAddr: TIdStackLocalAddress;
begin
LList := TIdStackLocalAddressList.Create;
TIdStack.IncUsage;
try
GStack.GetLocalAddressList(LList);
for var I := 0 to LList.Count - 1 do
begin
LAddr := LList[I];
if LAddr.IPVersion = TIdIPVersion.Id_IPv4 then
ComboBox1.Items.Add(LAddr.IPAddress);
end;
finally
TIdStack.DecUsage;
end;
end;
En el ejemplo de arriba, extraemos todas las IP y las guardamos en un TComboBox para que el usuario pueda seleccionar una.
Aclaramos que dicha función, extrae todas las IP versión 4, como lo indica en la siguiente línea:
if LAddr.IPVersion = TIdIPVersion.Id_IPv4 then
ComboBox1.Items.Add(LAddr.IPAddress);
Si lo que queremos es extraer todas las IP versión 6, cambiamos la línea por lo siguiente:
if LAddr.IPVersion = TIdIPVersion.Id_IPv6 then
ComboBox1.Items.Add(LAddr.IPAddress);
Y si no colocamos la condición, extraerá todas las IP sin distinguir la versión.