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

В Python, используя модуль IPy, вы можете сделать следующее:

>>> ip.iptype()
'PRIVATE'

Есть ли библиотека или простой способ сделать эквивалент в Java?

3 ответа

Кажется, что не точно, но InetAddress имеет некоторые методы isXX(), такие как: isAnyLocalAddress() и isSiteLocalAddress()


Я считаю, что Inet4Address.isSiteLocalAddress() - это метод, который вы хотите. Вот пример:

public final class IPFreely
{
 public static void main(String[] args)
 {
 byte[] rawAddress1 =
 { 10, 0, 0, 0 };
 byte[] rawAddress2 =
 { 10, 0, 32, 0 };
 byte[] rawAddress3 =
 { (byte) 172, 16, 0, 0 };
 byte[] rawAddress4 =
 { (byte) 192, (byte) 168, 0, 0 };
 testIpAddress(rawAddress1);
 testIpAddress(rawAddress2);
 testIpAddress(rawAddress3);
 testIpAddress(rawAddress4);
 }
 public static void testIpAddress(byte[] testAddress)
 {
 Inet4Address inet4Address;
 try
 {
 inet4Address = (Inet4Address) InetAddress.getByAddress(testAddress);
 System.out.print("inet4Address.isSiteLocalAddress(): ");
 System.out.println(inet4Address.isSiteLocalAddress());
 }
 catch (UnknownHostException exception)
 {
 System.out.println("UnknownHostException");
 }
 }
}


Если InetAddress не работает для вас, тогда должно быть достаточно легко перевести следующий код python в java:

IPv4ranges = {
 '0': 'PUBLIC', # fall back
 '00000000': 'PRIVATE', # 0/8
 '00001010': 'PRIVATE', # 10/8
 '01111111': 'PRIVATE', # 127.0/8
 '1': 'PUBLIC', # fall back
 '1010100111111110': 'PRIVATE', # 169.254/16
 '101011000001': 'PRIVATE', # 172.16/12
 '1100000010101000': 'PRIVATE', # 192.168/16
 '111': 'RESERVED' # 224/3
 }
def iptype(self):
 if self._ipversion == 4:
 iprange = IPv4ranges
 elif self._ipversion == 6:
 iprange = IPv6ranges
 else:
 raise ValueError("only IPv4 and IPv6 supported")
 bits = self.strBin()
 for i in xrange(len(bits), 0, -1):
 if bits[:i] in iprange:
 return iprange[bits[:i]]
 return "unknown"

licensed under cc by-sa 3.0 with attribution.