ip数据库的格式有个ip范围段
数据库中,
ip1列式某个地区的开始ip地址如0.0.0.0
ip2列是结束地址,0.255.255.255
zone是地区名称如:IANA如果根据输入一个ip能从数据库中快速找到地区名
数据库中,
ip1列式某个地区的开始ip地址如0.0.0.0
ip2列是结束地址,0.255.255.255
zone是地区名称如:IANA如果根据输入一个ip能从数据库中快速找到地区名
调试欢乐多
192.168.2.19 转化的结束IP=192*255*255*255+168*255*255+2*255+19;
IP Number = 16777216*w + 65536*x + 256*y + z (1)
where
IP Address = w.x.y.z
说明:16777216,65536,256;这个数都是系数,就像圆周率3.14一样 w.x.y.z分别对应真实的IP地址,eg:192.168.0.19;link eg:
IP Address = 202.186.13.4
So, w = 202, x = 186, y = 13 and z = 4
IP Number = 16777216*202 + 65536*186 + 256*13 + 4
= 3388997632 + 12189696 + 3328 + 4
= 3401190660这样就得到一个Ip Number了,现在我们就可以到我们的数据库去找它对就的IP段,即能得来是哪一个国家关于从数据库的代码我就不多说了哟
转化30多万数据用了10分钟
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net;
using System.Collections.Generic;
namespace IP
{
/// <summary>
/// IPCLASS 的摘要说明
/// </summary>
public class IPRange
{
public IPRange()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
private string _Name = string.Empty;
private ulong _BeginIP = 0;
private ulong _EndIP = Int32.MaxValue;
/**////
/// IP段名称
///
public string Name
{
get { return _Name; }
set { _Name = value; }
}
/**////
/// ?始IP
///
public ulong BeginIP
{
get { return _BeginIP; }
set { _BeginIP = value; }
}
/**////
/// ?束IP
///
public ulong EndIP
{
get { return _EndIP; }
set { _EndIP = value; }
}
/**////
/// 此IP段的范?
///
public ulong Range
{
get
{
return EndIP - BeginIP;
}
}
public IPRange(string name, string ipBegin, string ipEnd)
{
this.Name = name;
this.BeginIP = IP2A(ipBegin);
this.EndIP = IP2A(ipEnd);
}
public static ulong IP2A(string ip)
{
byte[] bytes = IPAddress.Parse(ip).GetAddressBytes();
ulong ret = 0;
foreach (byte b in bytes)
{
ret <<= 8;
ret |= b;
}
return ret;
}
public static int Compare(IPRange x, IPRange y)
{
if(x.Range == y.Range)
return 0;
else if(x.Range > y.Range)
return 1;
else return -1;
}
}
public class IPRangeManage
{
public IPRangeManage()
{ }
private List< IPRange> _IPRangeList = new List< IPRange>();
private bool _NeedSort = true;
public void Add(IPRange ipRange)
{
string sqlstr = "select * from zxzx";
DataSet ds= SqlOperater.Execute.ExecuteDataSet(sqlstr);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
_IPRangeList.Add(new IPRange(ds.Tables[0].Rows[i]["adress"].ToString(),ds.Tables[0].Rows[i]["ip"].ToString(),ds.Tables[0].Rows[i]["ip2"].ToString()));
_NeedSort = true;
}
//_IPRangeList.Add(ipRange);
//_NeedSort = true;
}
private void Sort()
{
if (_NeedSort)
{
// _IPRangeList.Sort(new Comparison(IPRange.Compare));
}
}
public IPRange Search(string ipString)
{
ulong ip = IPRange.IP2A(ipString);
//this.Sort();
foreach (IPRange ir in _IPRangeList)
{
if (ir.BeginIP <= ip && ir.EndIP >= ip)
{
return ir;
}
}
return null;
}
}
调用
IP.IPRangeManage irm = new IP.IPRangeManage()
IP地址:model.fldIP + "(" + irm.Search(model.fldIP).Name+")"
LZ用过PHP没?可以参考PHPCMS里的有个类 ip_area.class.php<?php
define('IPDATA_MINI', 'ipdata/mini.Dat');
define('IPDATA_FULL', 'ipdata/QQWry.Dat');class ip_area
{
var $fp = NULL;
var $func;
var $offset;
var $index; function ip_area()
{
if(@file_exists(IPDATA_MINI))
{
$this->func = 'data_mini';
$this->fp = @fopen(IPDATA_MINI, 'rb');
$this->offset = unpack('Nlen', fread($this->fp, 4));
$this->index = fread($this->fp, $this->offset['len'] - 4);
}
elseif(@file_exists(IPDATA_FULL))
{
$this->func = 'data_full';
$this->fp = @fopen(IPDATA_FULL, 'rb');
}
} function get($ip)
{
$return = '';
if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip))
{
$iparray = explode('.', $ip);
if($iparray[0] == 10 || $iparray[0] == 127 || ($iparray[0] == 192 && $iparray[1] == 168) || ($iparray[0] == 172 && ($iparray[1] >= 16 && $iparray[1] <= 31)))
{
$return = 'LAN';
}
elseif($iparray[0] > 255 || $iparray[1] > 255 || $iparray[2] > 255 || $iparray[3] > 255)
{
$return = 'Invalid IP Address';
}
else
{
$return = $this->func ? $this->{$this->func}($ip) : '';
if(strpos($return, ' ') !== false) $return = substr($return, 0, strpos($return,' '));
}
if(strtolower(CHARSET) == 'utf-8') $return = iconv('gbk', 'utf-8', $return);
}
return $return;
} function data_mini($ip)
{
$ipdot = explode('.', $ip);
$ipdot[0] = (int)$ipdot[0];
$ipdot[1] = (int)$ipdot[1];
$ip = pack('N', ip2long($ip));
$length = $this->offset['len'] - 1028;
$start = unpack('Vlen', $this->index[$ipdot[0] * 4] . $this->index[$ipdot[0] * 4 + 1] . $this->index[$ipdot[0] * 4 + 2] . $this->index[$ipdot[0] * 4 + 3]);
for($start = $start['len'] * 8 + 1024; $start < $length; $start += 8)
{
if($this->index{$start} . $this->index{$start + 1} . $this->index{$start + 2} . $this->index{$start + 3} >= $ip)
{
$this->index_offset = unpack('Vlen', $this->index{$start + 4} . $this->index{$start + 5} . $this->index{$start + 6} . "\x0");
$this->index_length = unpack('Clen', $this->index{$start + 7});
break;
}
}
fseek($this->fp, $this->offset['len'] + $this->index_offset['len'] - 1024);
if($this->index_length['len'])
{
return str_replace('- ', '', fread($this->fp, $this->index_length['len']));
}
else
{
return 'Unknown';
}
} function data_full($ip)
{
rewind($this->fp);
$ip = explode('.', $ip);
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
if(!($DataBegin = fread($this->fp, 4)) || !($DataEnd = fread($this->fp, 4)) ) return;
@$ipbegin = implode('', unpack('L', $DataBegin));
if($ipbegin < 0) $ipbegin += pow(2, 32);
@$ipend = implode('', unpack('L', $DataEnd));
if($ipend < 0) $ipend += pow(2, 32);
$ipAllNum = ($ipend - $ipbegin) / 7 + 1;
$BeginNum = $ip2num = $ip1num = 0;
$ipAddr1 = $ipAddr2 = '';
$EndNum = $ipAllNum;
while($ip1num > $ipNum || $ip2num < $ipNum)
{
$Middle= intval(($EndNum + $BeginNum) / 2);
fseek($this->fp, $ipbegin + 7 * $Middle);
$ipData1 = fread($this->fp, 4);
if(strlen($ipData1) < 4)
{
fclose($this->fp);
return 'System Error';
}
$ip1num = implode('', unpack('L', $ipData1));
if($ip1num < 0) $ip1num += pow(2, 32);
if($ip1num > $ipNum)
{
$EndNum = $Middle;
continue;
}
$DataSeek = fread($this->fp, 3);
if(strlen($DataSeek) < 3)
{
fclose($this->fp);
return 'System Error';
}
$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
fseek($this->fp, $DataSeek);
$ipData2 = fread($this->fp, 4);
if(strlen($ipData2) < 4)
{
fclose($this->fp);
return 'System Error';
}
$ip2num = implode('', unpack('L', $ipData2));
if($ip2num < 0) $ip2num += pow(2, 32);
if($ip2num < $ipNum)
{
if($Middle == $BeginNum)
{
fclose($this->fp);
return 'Unknown';
}
$BeginNum = $Middle;
}
}
$ipFlag = fread($this->fp, 1);
if($ipFlag == chr(1))
{
$ipSeek = fread($this->fp, 3);
if(strlen($ipSeek) < 3)
{
fclose($this->fp);
return 'System Error';
}
$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
fseek($this->fp, $ipSeek);
$ipFlag = fread($this->fp, 1);
}
if($ipFlag == chr(2))
{
$AddrSeek = fread($this->fp, 3);
if(strlen($AddrSeek) < 3)
{
fclose($this->fp);
return 'System Error';
}
$ipFlag = fread($this->fp, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($this->fp, 3);
if(strlen($AddrSeek2) < 3)
{
fclose($this->fp);
return 'System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($this->fp, $AddrSeek2);
}
else
{
fseek($this->fp, -1, SEEK_CUR);
}
while(($char = fread($this->fp, 1)) != chr(0))
$ipAddr2 .= $char;
$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
fseek($this->fp, $AddrSeek);
while(($char = fread($this->fp, 1)) != chr(0))
$ipAddr1 .= $char;
}
else
{
fseek($this->fp, -1, SEEK_CUR);
while(($char = fread($this->fp, 1)) != chr(0))
$ipAddr1 .= $char;
$ipFlag = fread($this->fp, 1);
if($ipFlag == chr(2))
{
$AddrSeek2 = fread($this->fp, 3);
if(strlen($AddrSeek2) < 3)
{
fclose($this->fp);
return 'System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($this->fp, $AddrSeek2);
}
else
{
fseek($this->fp, -1, SEEK_CUR);
}
while(($char = fread($this->fp, 1)) != chr(0))
$ipAddr2 .= $char;
}
if(preg_match('/http/i', $ipAddr2)) $ipAddr2 = '';
$ipaddr = "$ipAddr1 $ipAddr2";
$ipaddr = preg_replace('/CZ88\.NET/is', '', $ipaddr);
$ipaddr = preg_replace('/^\s*/is', '', $ipaddr);
$ipaddr = preg_replace('/\s*$/is', '', $ipaddr);
if(preg_match('/http/i', $ipaddr) || $ipaddr == '') $ipaddr = 'Unknown';
return ''.$ipaddr;
} function close()
{
@fclose($this->fp);
}
}
?>QQWry.Dat可以自动更新,有现成的EXE程序,定期更新后替换就OK了。
2、导入之前,讲IP做处理,转换成十进制,然后导入表中,再根据传进来的IP地址,转换成十进制后,进行表中查询。比如:aa.bb.cc.dd 十进制后 aa*256^3+bb*256^2+cc*256^1+dd*256^0
那么新查询的IP地址,只要也转换成十进制后,我们只要一条SQL语句select area from ip where ipaddress bettwen ipstart and ipend