2012-03-15 5 views
9

Как я могу проверить, находится ли ip-адрес в частной категории?Проверьте, находится ли ipAddress в личном диапазоне

if(isPrivateIPAddress(ipAddress)) { 
    //do something 
} 

Любые предложения будут оценены.

ОБНОВЛЕНО ОТВЕТ

private static boolean isPrivateIPAddress(String ipAddress) { 

     InetAddress ia = null; 

     try { 
      InetAddress ad = InetAddress.getByName(ipAddress); 
      byte[] ip = ad.getAddress(); 
      ia = InetAddress.getByAddress(ip); 
     } catch (UnknownHostException e) { 

      e.printStackTrace(); 
     } 

     return ia.isSiteLocalAddress(); 
    } 

Я написал этот метод, и он работает хорошо для меня. Но есть ли случай, когда этот метод не будет работать? Я просто хотел убедиться, что он будет работать для каждого случая.

+0

Дубликат http://stackoverflow.com/questions/8141277/check-if-ipv4-address-is-in-private-range – sw1nn

ответ

2

Это быстрый взлом, который я сгенерировал для проверки моего собственного адреса.

import java.net.InetAddress; 
import java.net.UnknownHostException; 

public class LocalAddress { 

    public static void main(String[] args) { 
     InetAddress address = null; 
     try { 
      address = InetAddress.getLocalHost(); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
     if (address.isSiteLocalAddress()) { 
      System.out.println("Site Local Address: " + address.getHostAddress()); 
     } else { 
      System.out.println("Routeable Address: " + address.getHostAddress()); 
     } 
    } 

} 

EDIT: Этот код не тестировался для локальных адресов ссылок, локального хоста или блоков адресов, зарезервированных для документации. Первые два случая имеют методы, которые возвращают их. Последнее не упоминается в документации к классу.

+0

Если мне нужно проверить какой-то случайный ipAddress, то как я могу это сделать? Предположим, что ipAddress равен 172.18.36.81 – AKIWEB

+0

Замените 'getLocalHost()' на 'getByName (" 172.18.36.81 ")'. Прочтите JavaDoc для InetAddress. – BillThor

13

Редактировать: Правильный метод - InetAddress.isSiteLocalAddress().

Утилита для проверки, является ли InetAddress локальным адресом сайта.

Возвращает: логическое значение, указывающее, является ли адрес InetAddress местным адресом ; или false, если адрес не является локальным адресом одноадресной рассылки.

Просмотреть комментарии для обсуждения.

+0

Можете ли вы дать мне один пример, основанный на этом. Действительно оценен. Спасибо – AKIWEB

+0

примеры в ссылке Я поставил в вопрос комментарий ... – sw1nn

+1

это '' InetAddress.isSiteLocalAddress() '', а не '' isLinkLocalAddress() ''. См. Http: // 4sysops.com/archives/ipv6-tutorial-part-6-site-local-addresses-and-link-local-addresses/для обсуждения – sw1nn

2

Прежде всего, частные сети могут использовать IPv4-адреса в любом месте в следующих диапазонах:

  • а) 192.168.0.0 - 192.168.255.255 (65536 IP-адресов)
  • б) 172.16.0.0 - 172.31 .255.255 (1048576 IP-адреса)
  • с) 10.0.0.0 - 10.255.255.255 (16777216 IP-адреса)

Как видно из метода isSiteLocalAddress в Inet4Address.java:

public boolean isSiteLocalAddress() { 
    // refer to RFC 1918 
    // 10/8 prefix 
    // 172.16/12 prefix 
    // 192.168/16 prefix 
    int address = holder().getAddress(); 
    return (((address >>> 24) & 0xFF) == 10) 
     || ((((address >>> 24) & 0xFF) == 172) 
      && (((address >>> 16) & 0xF0) == 16)) 
     || ((((address >>> 24) & 0xFF) == 192) 
      && (((address >>> 16) & 0xFF) == 168)); 
} 

В таком случае б) 172.16.0.0 - 172.31.255.255 (1 045 577 IP-адресов) не выполняется. Но вы можете легко написать вам собственный вариант, как сказать, является ли адрес частной address.Here моя версия:

import com.google.common.net.InetAddresses; 

private static boolean isPrivateV4Address(String ip) { 
    int address = InetAddresses.coerceToInteger(InetAddresses.forString(ip)); 
    return (((address >>> 24) & 0xFF) == 10) 
      || ((((address >>> 24) & 0xFF) == 172) 
       && ((address >>> 16) & 0xFF) >= 16 
       && ((address >>> 16) & 0xFF) <= 31) 
      || ((((address >>> 24) & 0xFF) == 192) 
       && (((address >>> 16) & 0xFF) == 168)); 
} 
+1

Этот ответ неверен. Случай b) выполняется, потому что маска '0xF0'. Тривиально проверять, что 'InetAddress.getByName (" 172.31.255.255 "). IsSiteLocalAddress()' возвращает true. –

+1

@AlejandroCDeBaca верна. –

0

Я использую это:

public boolean isPrivateIP(String ipAddress) { 
     boolean isValid = false; 

     if (ipAddress != null && !ipAddress.isEmpty()) { 
      String[] ip = ipAddress.split("\\."); 
      short[] ipNumber = new short[] { 
        Short.parseShort(ip[0]), 
        Short.parseShort(ip[1]), 
        Short.parseShort(ip[2]), 
        Short.parseShort(ip[3]) 
       }; 

      if (ipNumber[0] == 10) { // Class A 
       isValid = true; 
      } else if (ipNumber[0] == 172 && (ipNumber[1] >= 16 && ipNumber[1] <= 31)) { // Class B 
       isValid = true; 
      } else if (ipNumber[0] == 192 && ipNumber[1] == 168) { // Class C 
       isValid = true; 
      } 
     } 

     return isValid; 
    } 
Смежные вопросы