Проверьте, находится ли IPv4-адрес в частном диапазоне - PullRequest
6 голосов
/ 15 ноября 2011

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

 >>> ip.iptype()
'PRIVATE'

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

Ответы [ 3 ]

11 голосов
/ 15 ноября 2011

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

4 голосов
/ 15 ноября 2011

Я считаю, что 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");
        }
    }
}
3 голосов
/ 15 ноября 2011

Если 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...