Проверьте, находится ли ipAddress в закрытом диапазоне

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

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

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

ОБНОВЛЕННЫЙ ОТВЕТ

private static boolean ******************(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();
 }

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

4 ответа

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

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: этот код не был протестирован для локальных адресов ссылок, локального хоста или блоков адресов, зарезервированных для документации. Первые два случая имеют методы, которые возвращают их. Последнее не упоминается в документации к классу.


Изменить. Правильный метод InetAddress.isSiteLocalAddress().

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

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

См. комментарии к обсуждению.


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

  • a) 192.168.0.0 - 192.168.255.255 (65 536 IP-адресов)
  • b) 172.16.0.0 - 172.31.255.255 (1 048 576 IP-адресов)
  • c) 10.0.0.0 - 10.255.255.255 (16 777 216 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));
}

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

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


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

public boolean ***********(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;
 }

licensed under cc by-sa 3.0 with attribution.