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.
Advertisement
Answer
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)); } } }