InetAddress.getLocalHost(). GetHostAddress() возвращает 127.0.1.1
Мой вопрос похож на этот вопрос. Я хочу получить реальный IP-адрес моей машины (не 127.0.0.1), но странно, ниже код в моем Ubuntu возвращает 127.0.1.1
InetAddress.getLocalHost().getHostAddress()
Ниже мой полный код, первоначально размещенный в SO на здесь
public String getMachineIP() {
try {
String hostIP = InetAddress.getLocalHost().getHostAddress();
if (!hostIP.equals("127.0.0.1")) {
return hostIP;
}
/*
* Above method often returns "127.0.0.1", In this case we need to
* check all the available network interfaces
*/
Enumeration<NetworkInterface> nInterfaces = NetworkInterface
.getNetworkInterfaces();
while (nInterfaces.hasMoreElements()) {
Enumeration<InetAddress> inetAddresses = nInterfaces
.nextElement().getInetAddresses();
while (inetAddresses.hasMoreElements()) {
String address = inetAddresses.nextElement()
.getHostAddress();
if (!address.equals("127.0.0.1")) {
return address;
}
}
}
} catch (UnknownHostException e1) {
System.err.println("Error = " + e1.getMessage());
} catch (SocketException e1) {
System.err.println("Error = " + e1.getMessage());
}
return null;
}
Приведенный выше код возвращает 127.0.1.1, тогда как ifconfig
на моей машине Ubuntu дает ниже выход
[email protected]:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:21:70:b7:30:cd
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:28 Base address:0x6000
eth1 Link encap:Ethernet HWaddr 00:22:68:d3:02:b5
inet addr:192.168.2.112 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::222:68ff:fed3:2b5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:23827 errors:0 dropped:0 overruns:0 frame:32515
TX packets:23200 errors:46 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:22027719 (22.0 MB) TX bytes:3778268 (3.7 MB)
Interrupt:19
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:402 errors:0 dropped:0 overruns:0 frame:0
TX packets:402 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:29197 (29.1 KB) TX bytes:29197 (29.1 KB)
Я нашел запись 127.0.1.1 в файле хоста (странно для меня, так как я никогда не обновлял этот файл)
[email protected]:~# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 dell
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Как получить реальный IP-адрес моей машины (не 127.0.0.1)? Я ищу ТОЛЬКО для адреса IPv4, исключая 127.0.0.0/8 subnet
Ответы
Ответ 1
Вам нужно использовать NetworkInterface
для перечисления сетевых интерфейсов; InetAddress.getLocalHost()
всегда возвращает loopback. Это не объясняет, почему вы получаете 127.0.1.1 вместо 127.0.0.1, но так как этот метод не делает то, что вы пытаетесь сделать, это не кажется особенно уместным. См.: http://docs.oracle.com/javase/6/docs/api/java/net/NetworkInterface.html#getInetAddresses()
Ответ 2
Попробуйте этот код и вставьте то, что вы получаете:
Enumeration en = NetworkInterface.getNetworkInterfaces();
while(en.hasMoreElements()){
NetworkInterface ni=(NetworkInterface) en.nextElement();
Enumeration ee = ni.getInetAddresses();
while(ee.hasMoreElements()) {
InetAddress ia= (InetAddress) ee.nextElement();
System.out.println(ia.getHostAddress());
}
}
Это будет охватывать все IP-адреса, ограниченные вашим хостом.
Ответ 3
Вся подсеть 127.0.0.0/8 зарезервирована для устройств loopback (Зарезервированные IP-адреса)
Просто игнорируйте любой IP, начинающийся с 127:)