una tiene tabla subredes subred soluciones saber obtener mascaras mascara hay ejercicios dividir dirección direccionamiento direccion desea dada cuantas como calcular java networking ip

tiene - ¿Alguien conoce un componente de Java para verificar si la dirección IP proviene de una red/máscara de red en particular?



soluciones ejercicios direccionamiento ip (4)

Necesito determinar si la dirección IP dada proviene de alguna red especial, debo autenticarme automáticamente.


También puedes probar

boolean inSubnet = (ip & netmask) == (subnet & netmask);

o más corto

boolean inSubnet = (ip ^ subnet) & netmask == 0;


Jakarta Commons Net tiene org.apache.commons.net.util.SubnetUtils que parece satisfacer tus necesidades. Parece que haces algo como esto:

SubnetInfo subnet = (new SubnetUtils("10.10.10.0", "255.255.255.128")).getInfo(); boolean test = subnet.isInRange("10.10.10.10");

Tenga en cuenta, como señala carson , que Jakarta Commons Net tiene un error que le impide dar la respuesta correcta en algunos casos. Carson sugiere usar la versión SVN para evitar este error.


Para verificar una IP en una subred, utilicé el método isInRange en la clase SubnetUtils. Pero este método tiene un error que indica que si su subred es X, cada dirección IP menor que X, isInRange devuelve verdadero. Por ejemplo, si su subred fue 10.10.30.0/24 y desea verificar 10.10.20.5, este método devuelve verdadero. Para lidiar con este error usé el siguiente código.

public static void main(String[] args){ String list = "10.10.20.0/24"; String IP1 = "10.10.20.5"; String IP2 = "10.10.30.5"; SubnetUtils subnet = new SubnetUtils(list); SubnetUtils.SubnetInfo subnetInfo = subnet.getInfo(); if(MyisInRange(subnetInfo , IP1) == true) System.out.println("True"); else System.out.println("False"); if(MyisInRange(subnetInfo , IP2) == true) System.out.println("True"); else System.out.println("False"); } private boolean MyisInRange(SubnetUtils.SubnetInfo info, String Addr ) { int address = info.asInteger( Addr ); int low = info.asInteger( info.getLowAddress() ); int high = info.asInteger( info.getHighAddress() ); return low <= address && address <= high; }


Use Spring IpAddressMatcher . A diferencia de Apache Commons Net, admite tanto ipv4 como ipv6.

import org.springframework.security.web.util.matcher.IpAddressMatcher; ... private void checkIpMatch() { matches("192.168.2.1", "192.168.2.1"); // true matches("192.168.2.1", "192.168.2.0/32"); // false matches("192.168.2.5", "192.168.2.0/24"); // true matches("92.168.2.1", "fe80:0:0:0:0:0:c0a8:1/120"); // false matches("fe80:0:0:0:0:0:c0a8:11", "fe80:0:0:0:0:0:c0a8:1/120"); // true matches("fe80:0:0:0:0:0:c0a8:11", "fe80:0:0:0:0:0:c0a8:1/128"); // false matches("fe80:0:0:0:0:0:c0a8:11", "192.168.2.0/32"); // false } private boolean matches(String ip, String subnet) { IpAddressMatcher ipAddressMatcher = new IpAddressMatcher(subnet); return ipAddressMatcher.matches(ip); }

Fuente: aquí