java - programacion - Dirección IP al país con base de datos
manual de programacion android pdf (4)
He descargado ip-to-country.csv que tiene rangos de ip que están mapeados a países. ¿Cómo debo almacenar estos datos en la base de datos y cómo puedo consultar en qué rango la dirección IP es para saber de dónde viene la dirección Ip?
Para IPv4, puede almacenar en el siguiente formato:
- Convierte direcciones IP a enteros. Entonces 127.0.0.1 se convertirá en 2 147 483 649
- Almacene su tabla como triple IPDe IP a País
- Crear índices para IpFrom e IpTo
Cuando necesite buscar la dirección IP ejecute la siguiente consulta
SELECT Country from GeoIP where IpFrom < $IP and $IP < $IpTo
Esto le dará el país para la dirección IP
Puede construir el índice solo para valores de rangos ipTo (límite alto) y usar la consulta:
select country from geoip where $ip <= ipTo limit 1
(se supone que los rangos no se superponen como en la base de datos MaxMind)
Eche un vistazo al manual de IP a país
El archivo ip-to-country.csv contiene cinco campos:
* Begining of IP address range
* Ending of IP address range
* Two-character country code based on ISO 3166
* Three-character country code based on ISO 3166
* Country name based on ISO 3166
Puede importar estos datos en cualquier base de datos creando una tabla con los siguientes campos:
FIELD DATA TYPE FIELD DESCRIPTION
IP_FROM NUMERICAL (DOUBLE) Beginning of IP address range.
IP_TO NUMERICAL (DOUBLE) Ending of IP address range.
COUNTRY_CODE2 CHAR(2) Two-character country code based on ISO 3166.
COUNTRY_CODE3 CHAR(3) Three-character country code based on ISO 3166.
COUNTRY_NAME VARCHAR(50) Country name based on ISO 3166
Puede consultar la tabla anterior, después de haber importado los datos en ella, para encontrar el país de un Número de IP correspondiente emitiendo la siguiente declaración Seleccionar:
SELECT COUNTRY_NAME FROM <TableName> WHERE IP_FROM <= IP Number and IP_TO >= IP Number
donde el número de IP de un determinado ABCD IP, se calcula mediante:
IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
Escribí una pequeña lib llamada ip2c para hacer exactamente eso. usa la base de datos de webhosting.info pero también la admite desde Software77 .
Convierte la información CSV en un formato binario compacto y puede hacer la búsqueda directamente en el archivo, en la memoria o en un archivo mapeado en la memoria.
El uso de la API de Java es similar a esto:
String ip = 85.64.225.159;
int caching1 = IP2Country.NO_CACHE; // Straight on file, Fastest startup, slowest queries
int caching2 = IP2Country.MEMORY_MAPPED; // Memory mapped file, fast startup, fast queries.
int caching3 = IP2Country.MEMORY_CACHE; // load file into memory, slowerst startup, fastest queries
IP2Country ip2c = new IP2Country(caching1);
Country c = ip2c.getCountry(ip);
if (c == null)
{
System.out.println("UNKNOWN");
}
else
{
// will output IL ISR ISRAEL
System.out.println(c.get2cStr() + " " + c.get3cStr() + " " + c.getName());
}