现在很多软件都需要判断ip地址来源的功能,可以将纯真ip数据库做成一套通用的模块,废话少说,下面开始动手

1           首先从网上下载到纯真ip数据库mdb版,转到sql

        转到sql


数据库的结构如下

    4 内容



5       最后的两个字段代表的什么意思?应该是ip地址对应的值吧
验证一下

 3*256^3 = 50331648 
 4*256^3 =67108864
 startid 5.0331648E+7
 endid 6.7108864E+7

这样的话搜索的话就方便了,只要将ip地址转为对应的值,然后判断一下在哪个个记录的ip值区间内,就可以知道是哪个地址,测试一下


select 4*256*256*256
select top 1 * from ip

50331648
67108864
3.0.0.0 3.255.255.255 美国 新泽西通用电气公司 NULL 5.0331648E+7 6.7108864E+7
的确跟我们想得一样


拿一个ip地址测试一下218.57.241.35 转换成值 3545755940怎么回事,怎么出了两个记录,应该正确的是后一个才对么,考虑了一下,可能是因为转换成科学计数法数值比较模糊,所以出现了两个匹配记录,强制修改为float比较应该会不一样,修改一下sql语句再做测试,通过




7   下面可以写程序了,写一个helper类吧

     public static string GetIpRealWorldAddress(string ipAddress)
        {
            if (!IpAddressAvailable(ipAddress))
            {
                return "ip地址有问题";
            }

            long value = GetIPCount(ipAddress);
            string Sql = string.Format("select * from ip where convert(float,startid)<= {0} and convert(float,endid) >= {0}", value);
            using (SqlConnection _SqlConnection = new SqlConnection(SQLHelper.conn) )
            {
                SqlCommand _SqlCommand = new SqlCommand(Sql, _SqlConnection);
                _SqlConnection.Open();
                SqlDataReader _SqlDataReader = _SqlCommand.ExecuteReader();
                if (_SqlDataReader.Read())
                {
                    //[startip], [endip], [country], [local], [startid], [endid]
                    string startip = (string)_SqlDataReader["startip"];
                    string endip = (string)_SqlDataReader["endip"];
                    string country = (string)_SqlDataReader["country"];
                    //float local = (float)_SqlDataReader["local"];
                    float startid = (float)_SqlDataReader["startid"];
                    float endid = (float)_SqlDataReader["endid"];
                    return country;
                }
                else
                {
                    return "没有找到匹配的记录!";
                }
            }
        }

 

        //取得ip的long值 3.254.255.255 = 3*256^3 + 254 *256^2
        public static long GetIPCount(string ipAddress)
        {
            ipAddress = ipAddress.Trim();
            string[] ipSecs = ipAddress.Split('.');
            long value = 0;
            for (int i = 0; i < 4; i++)
            {
                int ipSecDec = int.Parse(ipSecs[i]);
                int power = 3-i;
                long ipSecValue = (long)( ipSecDec * Math.Pow(256, power));
                value = value + ipSecValue;
            }
            value = value + 1;
            return value;
        }

 

        /// <summary>
        /// 判断ip地址是否有问题  1 地址段数, 地址段数里面是否是数字,数字是否在 0-255范围内
        /// 从以上三个方面监测
        /// </summary>
        /// <param name="ipAddress"></param>
        /// <returns></returns>
        private static bool IpAddressAvailable(string ipAddress)
        {
            ipAddress = ipAddress.Trim();
            string[] ipSecs =  ipAddress.Split('.');
            if (ipSecs.Length != 4) return false;
        
            //如果每个段都可以转为int则返回真
            for (int i = 0; i < ipSecs.Length; i++)
   {
                try
                {
                    int ipSecDec = int.Parse(ipSecs[i]);
                    if (ipSecDec < 0 || ipSecDec > 255)
                    {
                        return false;
                    }
                }
                catch
                {
                    return false;
                }
   }
            return true;
        }
    }

8 测试通过



ok,头一次写东西,希望大家喜欢





posted on 2007-12-22 22:36  qdzhaokun  阅读(1308)  评论(1编辑  收藏  举报