Por lo tanto, estoy tratando de obtener la dirección IP de mi máquina en mi red local (que debe ser 192.168.178.41
).Obtener la dirección IP local sin conectarse a Internet
Mi primera intención era utilizar algo como esto:
InetAddress.getLocalHost().getHostAddress();
pero sólo devuelve 127.0.0.1
, lo cual es correcto pero no muy útil para mí.
Busqué y encontré esta respuesta https://stackoverflow.com/a/2381398/717341, que simplemente crea un Socket
-conexión a alguna página web (por ejemplo, "google.com") y obtiene la dirección de host local de la toma:
Socket s = new Socket("google.com", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();
Esto funciona para mi máquina (devuelve 192.168.178.41
), pero necesita conectarse a Internet para funcionar. Dado que mi aplicación no requiere conexión a Internet y podría parecer "sospechosa" que la aplicación intente conectarse a Google cada vez que se lance, no me gusta la idea de usarla.
Así que, después de más investigación me encontré con la NetworkInterface
-class, que (con algo de trabajo) no también devuelve la IP deseada Dirección:
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()){
NetworkInterface current = interfaces.nextElement();
System.out.println(current);
if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
Enumeration<InetAddress> addresses = current.getInetAddresses();
while (addresses.hasMoreElements()){
InetAddress current_addr = addresses.nextElement();
if (current_addr.isLoopbackAddress()) continue;
System.out.println(current_addr.getHostAddress());
}
}
En mi máquina, este devuelve lo siguiente:
name:eth1 (eth1)
fe80:0:0:0:226:4aff:fe0d:592e%3
192.168.178.41
name:lo (lo)
Encuentra mis dos interfaces de red y devuelve la IP deseada, pero no estoy seguro de qué significa la otra dirección (fe80:0:0:0:226:4aff:fe0d:592e%3
).
Además, no he encontrado una manera de filtrarlo de las direcciones devueltas (usando el isXX()
-metodos del InetAddress
-objeto) y luego usando RegEx, que me parece muy "sucio".
¿Alguna otra idea que no sea usar RegEx o Internet?
fe80: 0: 0: 0: 226: 4AFF: fe0d: 592 sexies se parece a una dirección IPv6 fe80 :: –
'' ... es un IPv6 de enlace local addres s – fge
Y, por cierto, ¿qué quiere "filtrar"? Y, por supuesto, ¿sabes que una máquina puede ser multihomed? – fge