【问题标题】:InetAddress.getLocalHost().getHostAddress() is returning 127.0.1.1 [duplicate]InetAddress.getLocalHost().getHostAddress() 返回 127.0.1.1 [重复]
【发布时间】:2013-05-08 15:38:27
【问题描述】:

我的问题类似于 this question 。我想获得我机器的真实 IP(不是 127.0.0.1)但奇怪的是,我的 Ubuntu 中的以下代码返回 127.0.1.1

InetAddress.getLocalHost().getHostAddress()

以下是我的完整代码,最初发布在 SOhere

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 而我的 Ubuntu 机器上的 ifconfig 给出以下输出

root@dell:~# 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 条目(对我来说很奇怪,因为我从未更新过此文件)

root@dell:~# 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

【问题讨论】:

  • 跳过 127.0.1.1 会发生什么(想知道)
  • 不要标记为重复...我收到的是 127.0.1.1 而不是 127.0.0.1
  • 您的hostname 似乎是dell(您将root@dell 报告为命令提示符),/etc/hosts 中的解析器信息显示为 127.0.1.1。是的,这个重复的,正如你所问的“我只在寻找不包括 127.0.0.0/8 子网的 IPv4 地址”
  • @Raedwald:是的,hostname 是戴尔,但我从未在主机文件中添加127.0.1.1ifconfig 没有显示127.0.1.1,那么java 怎么会返回127.0.1.1

标签: java


【解决方案1】:

您需要使用NetworkInterface 来枚举网络接口; InetAddress.getLocalHost() 总是返回环回。这并不能解释为什么您得到 127.0.1.1 而不是 127.0.0.1,但是由于该方法没有执行您想要执行的操作,因此它似乎并不是特别相关。见:http://docs.oracle.com/javase/6/docs/api/java/net/NetworkInterface.html#getInetAddresses()

【讨论】:

  • 枚举网络接口后,我得到fe80:0:0:0:222:68ff:fed3:2b5%3, 192.168.2.112, 0:0:0:0:0:0:0:1%1 and 127.0.0.1
  • 这些是您的活动网络接口。它们依次是:外部 IPv6、外部 IPv4、环回 IPv6、环回 IPv4。根据您的问题,这似乎是您正在寻找的内容......如果您想要外部 IP,则必须使用外部服务来解决它。
  • 我只寻找 IPv4 地址,不包括 127.0.0.0/8 subnet
  • 然后迭代你得到的列表并过滤掉任何不是 IPv4 地址的东西和任何在 127.0.0.0/8 子网上的东西。
  • 你确定它总是返回环回吗? java String local = impl.getLocalHostName(); if (local.equals("localhost")) { return impl.loopbackAddress(); }
【解决方案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 地址

【讨论】:

  • 以下是输出fe80:0:0:0:222:68ff:fed3:2b5%3, 192.168.2.112, 0:0:0:0:0:0:0:1%1 and 127.0.0.1
  • 好吧,127 是一个环回地址,只对您的主机可见,192 是一个私有 IP 地址。似乎开始 fe80 的一个被作为十六进制 IP 地址返回 - 这可能是您正在寻找的那个。我不是 100% 确定,还有其他人可以解释为什么这是一个十六进制地址吗?
  • 我目前已连接到 wifi 网络。出于我的目的,192 可以正常工作..
  • 十六进制地址是 192 地址的 IPv6 等价物。
【解决方案3】:

整个 127.0.0.0/8 子网为环回设备保留 (Reserved IP addresses) 忽略任何以 127 开头的 IP :)

【讨论】:

  • 这可能会有所帮助,我应该忽略所有以 127 开头的 IP。
  • IPv6 将失败。而是忽略InetAddress.isLoopbackAddress() 地址。
猜你喜欢
  • 2012-02-26
  • 2019-09-10
  • 1970-01-01
  • 2019-05-20
  • 2011-11-15
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多