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;
}
¿Pero cómo conseguir la máscara? ¿Y esto también funciona para IPv6? – xZise
@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
¿Pero cómo obtener la máscara de subred del programa mismo? – xZise