Search code examples
javaipv4network-interface

How would I get only IPv4 addresses


I have the following code which is supposed to get only the IPv4 addresses of all active interfaces, but it still returns an IPv6 address on some computers.

public static List<List> getIpAddress() {
    List<String> ip = new ArrayList<>();
    List<List> ipRefined = new ArrayList<>();
    try {
        Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
        while (interfaces.hasMoreElements()) {
            NetworkInterface iface = interfaces.nextElement();
            if (iface.isLoopback() || !iface.isUp())
                continue;
            Enumeration<InetAddress> addresses = iface.getInetAddresses();
            while(addresses.hasMoreElements()) {
                ip.add(addresses.nextElement().getHostAddress());
            }
        }
    } catch (SocketException e) {
        throw new RuntimeException(e);
    }
    for(int x = 0; x < ip.size(); x++){
        if(ip.get(x).contains("%")){
            try {
                if (ip.get(x + 1).contains(".")) {
                    List<String> tempList = new ArrayList<>();
                    tempList.add(ip.get(x).substring(ip.get(x).indexOf("%") + 1));
                    tempList.add(ip.get(x + 1));
                    ipRefined.add(tempList);
                }
            } catch (IndexOutOfBoundsException ae) {
            }
        }
    }
    return ipRefined;
}

I've tried to specify using only IPv4 by using System.setProperty("java.net.preferIPv4Stack" , "true");, but this only causes getIpAddress() to return an empty list. How should I be getting the IPv4 of active interfaces without the use of string manipulation?

EDIT:

Using System.setProperty("java.net.preferIPv4Stack" , "true"); always causes getIpAddress() to return an empty list.


Solution

  • From InterfaceAddress

    This class represents a Network Interface address. In short it's an IP address, a subnet mask and a broadcast address when the address is an IPv4 one. An IP address and a network prefix length in the case of IPv6 address.

    Here's my code:

    Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
    while (interfaces.hasMoreElements()) {
      NetworkInterface networkInterface = interfaces.nextElement();
      System.out.println(String.format("networkInterface: %s", networkInterface.toString()));
    
      if (!networkInterface.isUp()) {
        continue;
      }
    
      for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
        int npf = interfaceAddress.getNetworkPrefixLength();
        InetAddress address = interfaceAddress.getAddress();
        InetAddress broadcast = interfaceAddress.getBroadcast();
        if (broadcast == null && npf != 8) {
          System.out.println(String.format("IPv6: %s; Network Prefix Length: %s", address, npf));
        } else {
          System.out.println(String.format("IPv4: %s; Subnet Mask: %s; Broadcast: %s", address, npf, broadcast));
        }
      }
    }