У меня есть следующий код, который должен получать только IPv4-адреса всех активных интерфейсов, но он по-прежнему возвращает IPv6-адрес на некоторых компьютерах.Как получить только адреса IPv4
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;
}
Я попытался указать использование только IPv4 с помощью System.setProperty("java.net.preferIPv4Stack" , "true");
, но это приводит к getIpAddress()
только возвращает пустой список. Как мне получить IPv4 активных интерфейсов без использования манипуляций с строкой?
EDIT:
Использование System.setProperty("java.net.preferIPv4Stack" , "true");
всегда вызывает getIpAddress()
возвращать пустой список.
Я не уверен в этом, но, как вы читаете через 'addresses' перечисление, как насчет проверки, если каждый адрес' InstanceOf Inet4Address'? – yshavit
Я мог бы попробовать это, но я думаю, проблема в том, что интерфейс только возвращает свой IPv6. Позвольте мне сделать некоторую отладку реальной быстро. –
Похоже, что я уже фильтрую его, так что только IPv4 может быть возвращен, когда я делаю 'if (ip.get (x + 1) .contains (". "))'. Я переписал часть своего кода, чтобы использовать 'instanceof' вместо использования' contains() ', но ничего не изменит. Я собираюсь обновить вопрос еще одной деталью. –