在Java中获取eth0接口的IP地址仅返回IPv6地址而不返回IPv4

jgr*_*208 5 java ipv4 inetaddress network-interface

我编写了以下代码,以获取我在计算机上使用的eth0接口的IPv4地址。但是,fe80:x:x:x:xxx:xxxx:xxxx:xxxx由于我正在查找IPv4地址,因此代码仅查找未返回的代码。

这是代码。

    interfaceName = "eth0";
    NetworkInterface networkInterface = NetworkInterface.getByName(interfaceName);
    Enumeration<InetAddress> inetAddress = networkInterface.getInetAddresses();
    InetAddress currentAddress;
    currentAddress = inetAddress.nextElement();
    while(inetAddress.hasMoreElements())
    {
        System.out.println(currentAddress);
        if(currentAddress instanceof Inet4Address && !currentAddress.isLoopbackAddress())
        {
            ip = currentAddress.toString();
            break;
        }
        currentAddress = inetAddress.nextElement();
    }
Run Code Online (Sandbox Code Playgroud)

jgr*_*208 6

它弄乱了获取下一个元素的逻辑。inetAddresswhile比较运行之前,我已经获取了下一个元素。从而使元素不再存在。

下面的代码已经修复了逻辑

    interfaceName = "eth0";
    NetworkInterface networkInterface = NetworkInterface.getByName(interfaceName);
    Enumeration<InetAddress> inetAddress = networkInterface.getInetAddresses();
    InetAddress currentAddress;
    currentAddress = inetAddress.nextElement();
    while(inetAddress.hasMoreElements())
    {
        currentAddress = inetAddress.nextElement();
        if(currentAddress instanceof Inet4Address && !currentAddress.isLoopbackAddress())
        {
            ip = currentAddress.toString();
            break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,要在语义上正确,您需要删除对 `intetAddress.nextElement()` 的第一个调用 - _before_ while 循环,因为您将始终将第一个元素扔掉,因为它当前是写的! (3认同)