现在很多软件都需要判断ip地址来源的功能,可以将纯真ip数据库做成一套通用的模块,废话少说,下面开始动手
1 首先从网上下载到纯真ip数据库mdb版,转到sql
2 转到sql
3 数据库的结构如下
4 内容
![](https://www.cnblogs.com/images/cnblogs_com/qdzhaokun/117108/r_%e6%95%b0%e6%8d%ae%e5%ba%93%e5%86%85%e5%ae%b9.jpg)
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
的确跟我们想得一样
6 拿一个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,头一次写东西,希望大家喜欢