2011-12-19 30 views
8

¿Cómo puedo comprobar si dos direcciones IP están en la misma red de acuerdo con la máscara de subred?Pruebe con Java si hay dos direcciones IP en la misma red

Por ejemplo, tengo las direcciones IP 1.2.3.4 y 1.2.4.3: ambas están en la misma red si la máscara es 255.0.0.0 o 255.255.0.0 o incluso 255.255.248.0, pero no si la máscara es 255.255.255.0.

Respuesta

5

Bastante simple: mask & ip1 == mask & ip2 - tiene que interpretar las direcciones IP todas como un solo número para eso, pero eso debería ser obvio.

+0

¿Pero cómo conseguir la máscara? ¿Y esto también funciona para IPv6? – xZise

+0

@xZise La máscara es su máscara de subred. Y seguro que funcionará para IPv6 igual de bien, solo una notación diferente en comparación con IPv4. Pero al final solo usa la máscara de subred para enmascarar la parte de la red de la IP y luego compararlos entre sí. – Voo

+0

¿Pero cómo obtener la máscara de subred del programa mismo? – xZise

14

Pruebe este método:

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; 

} 

Y utilizar de esta manera:

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

EDIT:

Si ya tiene las IPs como InetAddress objetos:

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; 

} 
+0

Buena solución: evita tener que analizar la cadena usted mismo. – Voo

+0

Ya tengo las direcciones IP como InetAddresses, por lo que a lo sumo tengo que analizar la máscara. – xZise

+0

@xZise He editado mi respuesta para que coincida con su último comentario. Tenga en cuenta que si la máscara es la misma para todas las comparaciones, sería mejor calcular su dirección de byte [] solo una vez y reutilizarla –

0

esta solución funcionará también con 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); 
} 
Cuestiones relacionadas