Проверьте с Java, если два IP-адреса находятся в одной сети - PullRequest
8 голосов
/ 19 декабря 2011

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

Например, у меня есть IP 1.2.3.4 и 1.2.4.3: оба находятся в одной сети, если маскаравно 255.0.0.0 или 255.255.0.0 или даже 255.255.248.0, но не если маска равна 255.255.255.0 ..

Ответы [ 3 ]

14 голосов
/ 19 декабря 2011

Попробуйте этот метод:

public static boolean sameNetwork(String ip1, String ip2, String mask) 
throws Exception {

    byte[] a1 = InetAddress.getByName(ip1).getAddress();
    byte[] a2 = InetAddress.getByName(ip2).getAddress();
    byte[] m = InetAddress.getByName(mask).getAddress();

    for (int i = 0; i < a1.length; i++)
        if ((a1[i] & m[i]) != (a2[i] & m[i]))
            return false;

    return true;

}

И используйте это так:

sameNetwork("1.2.3.4", "1.2.4.3", "255.255.255.0")
> false

РЕДАКТИРОВАТЬ:

Если у вас уже есть IP-адреса как InetAddress объекты:

public static boolean sameNetwork(InetAddress ip1, InetAddress ip2, String mask) 
throws Exception {

    byte[] a1 = ip1.getAddress();
    byte[] a2 = ip2.getAddress();
    byte[] m = InetAddress.getByName(mask).getAddress();

    for (int i = 0; i < a1.length; i++)
        if ((a1[i] & m[i]) != (a2[i] & m[i]))
            return false;

    return true;

}
5 голосов
/ 19 декабря 2011

Достаточно просто: mask & ip1 == mask & ip2 - вы должны интерпретировать все IP-адреса как одно число, но это должно быть очевидно.

0 голосов
/ 08 апреля 2015

это решение будет работать и с IPv4 / IPv6.

static boolean sameNetwork(final byte[] x, final byte[] y, final int mask) {
    if(x == y) return true;
    if(x == null || y == null) return false;
    if(x.length != y.length) return false;
    final int bits  = mask &   7;
    final int bytes = mask >>> 3;
    for(int i=0;i<bytes;i++)  if(x[i] != y[i]) return false;
    final int shift = 8 - bits;
    if(bits != 0 && x[bytes]>>>shift != y[bytes]>>>shift) return false;
    return true;
}
static boolean sameNetwork(final InetAddress a, final InetAddress b, final int mask) {
    return sameNetwork(a.getAddress(), b.getAddress(), mask);
}
...