ip数据库的格式有个ip范围段
数据库中,
ip1列式某个地区的开始ip地址如0.0.0.0
ip2列是结束地址,0.255.255.255
zone是地区名称如:IANA如果根据输入一个ip能从数据库中快速找到地区名

解决方案 »

  1.   

    ip地址库一般有两个长整型的字段.192.168.1.10 转化的起始IP=192*255*255*255+168*255*255+1*255+10;
    192.168.2.19 转化的结束IP=192*255*255*255+168*255*255+2*255+19;
      

  2.   

    好像动网的ip数据库就这样吧,不过这样还要经过大量运算了,如果能够直接一条sql语句取出来就更好了,我的理想状态还是sql一下搞定它,呵呵。实在不行,就转化一下了。
      

  3.   

    enaddr=cint(str1)*256*256*256+cint(str2)*256*256+cint(str3)*256+cint(str4)-1 
      

  4.   

    一般都是先把ip转化为数字再存进数据库,再根据这个数字判断地区转:http://www.cnblogs.com/caodaiming/archive/2008/08/09/1264233.html今天在家里没有什么事做,就在网上走走看,看了一篇根据IP地址找到国家;这个其实在我们工作都用到个,但是不知道是怎么来做的.在下面我将把http://www.codeproject.com/KB/aspnet/aspxcode_net.aspx翻译过与大家一起来分享; 原理:现在各个国家的IP都有一个IP Begin Number 和一个Ip End Number数字,把国家的开始的数据,各结束的数据都存在数据库     最后通过一个计算公式把真实的IP地址转换成Ip Number,从数据库中找在Begin ,End之间的,如果在这间,就是这个国家的了;     关于各个国家的IP Number这个应该是国标的吧,应该不会变的,在文章的后提供下载; IP Number计算公式:         
    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段,即能得来是哪一个国家关于从数据库的代码我就不多说了哟
      

  5.   

    我之前弄有一个 把纯真ip转化成mdb 就是比较一下里面数字 就可得出地址
    转化30多万数据用了10分钟
      

  6.   

    sing System.Web.UI.WebControls;
    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+")"
      

  7.   

    我刚好最近也做了个类似的小单子
    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了。
      

  8.   

    我再说下思路1、是一次性导入所有的IP库,然后进行全表搜索;
    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