address - ip java
Cálculos de red IPv4/IPv6 y validación para Java? (5)
La clase InetAddress y las subclases relacionadas serían un muy buen lugar para comenzar: http://java.sun.com/j2se/1.4.2/docs/api/java/net/InetAddress.html
Estoy buscando un paquete que sea similar a Net_IPv4 y Net_IPv6 pero escrito para Java. Necesita poder hacer lo siguiente:
- Verificar que una dirección sea válida (por ejemplo, 127.0.0.1 es válida, 127.0.0.257 no)
- Devuelve si una dirección está contenida dentro de una subred (por ejemplo, 127.0.0.11 está en 127.0.0.0/28)
- Devuelve la dirección de difusión para una subred determinada (por ejemplo, para 127.0.0.0/28 es 127.0.0.15)
Sería increíble si también pudiera:
- Devuelve una lista de direcciones para una subred en orden
- Ordenar una lista de direcciones
Probablemente podría escribir un paquete para hacer todo esto, pero si alguien ya ha tenido problemas y lo más probable es que haya hecho un mejor trabajo, estoy a punto de usar eso. ¿Alguien sabe de tal paquete o paquetes que podrían hacer todo esto? Estamos expandiendo a IPv6, por lo que debe funcionar tanto para IPv4 como para IPv6 si es posible.
Agradezco cualquier ayuda.
Solo es para IPv4, pero la clase SubnetUtils que forma parte de Commons Net tiene la funcionalidad que está buscando. ¡Sobre la base de eso, podría codificar una versión IPv6 y contribuir de nuevo al proyecto! :)
Tal vez CIDRUtils puede ayudarte. Le permite convertir la notación CIDR a un rango de IP.
Descargo de responsabilidad: soy el autor de CIDRUtils.
Soy el principal colaborador de commons-ip-math , una biblioteca Java de código abierto que ofrece una API enriquecida para tratar los cálculos más comunes de números IPv4, IPv6 y AS. Aunque solo ha sido recientemente de código abierto, ha sido probado en batalla durante años dentro de RIPE NCC . Vea cómo puede usarlo a continuación.
(Todos los ejemplos funcionan con una sintaxis similar para los números IPv6 y AS. Solo use las clases Ipv6, Ipv6Range, Asn y AsnRange en su lugar).
- Verificar que una dirección sea válida (por ejemplo, 127.0.0.1 es válida, 127.0.0.257 no)
Ipv4.parse("127.0.0.1"); // IPv4 representation of "127.0.0.1"
Ipv4.parse("127.0.0.257"); // IllegalArgumentException
- Devuelve si una dirección está contenida dentro de una subred (por ejemplo, 127.0.0.11 está en 127.0.0.0/28)
Ipv4Range.parse("127.0.0.0/28").contains(Ipv4.parse("127.0.0.11")); //true
- Devuelve la dirección de difusión para una subred determinada (por ejemplo, para 127.0.0.0/28 es 127.0.0.15)
Ipv4Range.parse("127.0.0.0/28").start().upperBoundForPrefix(28) // 127.0.0.15
- Devuelve una lista de direcciones para una subred en orden
// Range types are Iterable
for (Ipv4 ipv4 : Ipv4Range.parse("127.0.0.0/30")) {
System.out.println(ipv4);
}
// Will print:
127.0.0.0
127.0.0.1
127.0.0.2
127.0.0.3
- Ordenar una lista de direcciones
Aunque la biblioteca ofrece comparadores para tipos de rango (por ejemplo, comparando el tamaño de las subredes), no hay comparador para direcciones individuales. Sin embargo, es bastante trivial escribir el suyo ya que los tipos Ipv4, IPv6 y ASN implementan la interfaz Comparable:
List<Ipv4> list = new ArrayList<Ipv4>();
list.add(Ipv4.of("0.0.0.3"));
list.add(Ipv4.of("0.0.0.4"));
list.add(Ipv4.of("0.0.0.2"));
list.add(Ipv4.of("0.0.0.1"));
Collections.sort(list, new Comparator<Ipv4>() {
@Override
public int compare(Ipv4 left, Ipv4 right) {
return left.compareTo(right);
}
});
System.out.println(list);
// Will print:
[0.0.0.1, 0.0.0.2, 0.0.0.3, 0.0.0.4]
La biblioteca IPAddress Java admite tanto IPv4 como IPv6 de forma polimórfica, incluidas las subredes. El javadoc está disponible en el enlace. Descargo de responsabilidad: soy el gerente del proyecto.
Todos los casos de uso enumerados son compatibles tanto para IPv4 como para Ipv6 de forma transparente. En otras palabras, difiere de la mayoría de las otras utilidades en el sentido de que el siguiente código funciona de forma idéntica con IPv4 o IPv6 como cadenas de entrada.
Verificar si una dirección es válida
String str = "::1";
IPAddressString addrString = new IPAddressString(str);
try {
IPAddress addr = addrString.toAddress();
...
} catch(IPAddressStringException e) {
//e.getMessage provides validation issue
}
Devuelve si la dirección está contenida dentro de una subred
String str = "1::1";
String subnetStr = "1::/64";
IPAddressString addrString = new IPAddressString(str);
IPAddressString subnetString = new IPAddressString(subnetStr);
try {
IPAddress addr = addrString.toAddress();
IPAddress subnet = subnetString.toAddress();
boolean isContained = subnet.contains(addr); //true in this case
...
} catch(IPAddressStringException e) {
//e.getMessage provides validation issue
}
Devuelve la dirección de difusión para una subred determinada
String subnet = "127.0.0.0/28";
IPAddressString subnetString = new IPAddressString(subnet);
try {
IPAddress subnet = subnetString.toAddress();
IPAddress broadcastAddr = subnet.getHighest();
...
} catch(IPAddressStringException e) {
//e.getMessage provides validation issue
}
Devuelve una lista de direcciones para una subred en orden
String subnet = "127.0.0.0/28";
IPAddressString subnetString = new IPAddressString(subnet);
try {
IPAddress subnet = subnetString.toAddress();
for(IPAddress addr : subnet) {
...
}
} catch(IPAddressStringException e) {
//e.getMessage provides validation issue
}
Ordenar una lista de direcciones
List<IPAddressString> addrs;
Collections.sort(addrs); //IPAddressString implements Comparable