2013-05-08 4 views
12

Мой вопрос похож на вопрос this. Я хочу, чтобы получить реальный IP моей машины (не 127.0.0.1), но странно, ниже код в моем Ubuntu возвращается 127.0.1.1InetAddress.getLocalHost(). GetHostAddress() возвращает 127.0.1.1

InetAddress.getLocalHost().getHostAddress() 

Ниже мой полный код, первоначально размещен в SO в here

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 дает ниже выходной

ro[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 в шлюшки т файл (Strange ко мне, так как я никогда не обновил этот файл)

[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

+0

Что произойдет, если вы пропустите 127.0.1.1 (интересно) – ssedano

+0

Помогло ли это? http://stackoverflow.com/q/8083479/1039920 – Thevenin

+0

Не указывайте как дубликат ... Я получаю '127.0.1.1' не' 127.0.0.1' –

ответ

5

Для перечисления сетевых интерфейсов вам необходимо использовать 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()

+0

После перечисления сетевого интерфейса я получаю 'fe80: 0: 0: 0: 222: 68ff: fed3: 2b5% 3, 192.168.2.112, 0: 0: 0: 0: 0: 0: 0: 1% 1 и 127.0.0.1' –

+0

Это активные сетевые интерфейсы. Для этого они: внешний IPv6, внешний IPv4, loopback IPv6, loopback IPv4. Это похоже на то, что вы искали, в соответствии с вашим вопросом ... если вы хотите свой внешний IP-адрес, вам придется использовать внешнюю службу для ее устранения. – Adrian

+0

Я ищу ТОЛЬКО для адреса IPv4, исключая '127.0.0.0/8 подсеть' –

4

Попробуйте этот код и вставить то, что вы получите:

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-адресов, ограниченных к вашему хосту

+1

Следующее является выходом' fe80: 0: 0: 0: 222: 68ff: fed3: 2b5% 3, 192.168.2.112, 0: 0: 0: 0: 0: 0: 0: 1% 1 и 127.0.0.Окно –

+1

ok 127 - это замкнутый адрес и видимый только вашему хосту, а 192 - частный IP-адрес. Похоже, что первый запуск fe80 возвращается в виде Hex IP-адреса - это может быть тот, который вы ищете. Я не уверен на 100%, может кто-нибудь еще пролить свет на то, почему это гексагорный адрес? – maloney

+0

В настоящее время я подключен к Wi-Fi сети. Для моей цели 192 будет работать нормально. –

2

Все 127.0.0.0/8 подсети защищены для устройств замыкания на себя (Reserved IP addresses)Просто игнорируйте любой IP-адрес, начинающийся с 127 :)

+0

Это может быть полезно, я должен игнорировать все IP, начиная с 127. –

+6

Это не удастся для IPv6. Вместо этого игнорируйте адреса 'InetAddress.isLoopbackAddress()'. – Raedwald

Смежные вопросы