2009-02-23 15 views

Respuesta

19

Jakarta Commons Net tiene org.apache.commons.net.util.SubnetUtils que parece satisfacer sus necesidades. Parece que se hace 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 a bug que le impide dar la respuesta correcta en algunos casos. Carson sugiere usar la versión SVN para evitar este error.

+4

Tenga cuidado al usar esto. Hay un error que evitará que funcione correctamente. Es posible que desee sacarlo de SVN. http://mail-archives.apache.org/mod_mbox/commons-issues/200902.mbox/%[email protected]%3E – carson

+0

@carson: Gracias por la advertencia. Edité mi respuesta para incluir esta información. – Eddie

9

También puede intentar

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

o más corto

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

¿Son las IP y las máscaras de red o longs? – simgineer

+0

Las direcciones de 32 bits, IPv4, son entradas. Sospecho que IPv6 son valores de 64 bits, pero no he usado el dobladillo –

3

Uso de Primavera de 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: here

0

Para comprobar un CI en una subred, que utiliza el método de EstaEnRango en 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; 
} 
Cuestiones relacionadas