Проверьте, находится ли 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.