2017-01-16 4 views
2

У меня есть следующий код, который должен получать только 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() возвращать пустой список.

+4

Я не уверен в этом, но, как вы читаете через 'addresses' перечисление, как насчет проверки, если каждый адрес' InstanceOf Inet4Address'? – yshavit

+0

Я мог бы попробовать это, но я думаю, проблема в том, что интерфейс только возвращает свой IPv6. Позвольте мне сделать некоторую отладку реальной быстро. –

+0

Похоже, что я уже фильтрую его, так что только IPv4 может быть возвращен, когда я делаю 'if (ip.get (x + 1) .contains (". "))'. Я переписал часть своего кода, чтобы использовать 'instanceof' вместо использования' contains() ', но ничего не изменит. Я собираюсь обновить вопрос еще одной деталью. –

ответ

0

От InterfaceAddress

Этот класс представляет собой адрес сетевого интерфейса. Короче говоря, это IP-адрес, маска подсети и широковещательный адрес, когда адрес является IPv4. IP-адрес и длина префикса сети в случае адреса IPv6.

Вот мой код:

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)); 
    } 
    } 
} 
+1

Комбинация этого и подстроки решила мой вопрос. –

Смежные вопросы