Ip address to country with database [closed]

折月煮酒 提交于 2019-11-28 22:11:17
Omry Yadan

I wrote a small lib called ip2c to do just that. it uses the database from webhosting.info but also supports that from Software77.

It converts the CSV info a compact binary format and can do the search straight on the file, in memory or in a memory mapped file.

The Java API usage is similar to this:

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());      
}

Have a look to the IP-to-Country Handbook
The ip-to-country.csv file contains five fields:

* 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

You can import this data into any database by creating a table with the following fields:

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

You can query the above table, after you have imported the data into it, to find the country of a corresponding IP Number by issuing the following Select statement:

SELECT COUNTRY_NAME FROM <TableName> WHERE IP_FROM <= IP Number and IP_TO >= IP Number

where IP Number of a given A.B.C.D IP, is calculated by :

IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
Vlad

For IPv4 you can store in the following format:

  1. Convert IP addresses to integers. So 127.0.0.1 will become 2 147 483 649
  2. Store your table as triple IPFrom IPTo Country
  3. Build indices for IpFrom and IpTo

When you need to look up the IP address execute the following query

SELECT Country from GeoIP where  IpFrom < $IP  and $IP < $IpTo

This will give you the country for the IP address

You can build index only for ipTo (high boundary) values of ranges and use query:

  select country from geoip where $ip <= ipTo limit 1

(it's assumed that ranges do not overlap as in MaxMind database)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!