下面这段代码将IP地址转换为地方名称,例如你的IP地址为 “58.24.25.65” 则显示为 “上海徐汇区”
当然转换过程中,需要有数据库,也就是这里适用的数据库是动网论坛最新版本DVBBS8.1提供的数据库,你可以到dvbbs下载那个论坛,然后在data目录下找到
ipaddress数据库文件,其中ip1和ip2对应ip地址的范围
这里介绍如何转换,它使用的是IP地址是10进制的,简单说一下IP原理,(以下均为假设)例如www.sohu.com 对应的IP地址为
12.24.10.45
首先将IP转换为二进制
0000 1000 . 0001 1000 . 0000 1010 . 0010 1101
然后转换为十六进制
0B. 18. 0A.2C
然后去掉小数点
0b180a2c
然后转换为十进制就可以了,代码如下
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.OleDb"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
string Ip =Request.UserHostAddress;
string[] Ip_List = Ip.Split(".".ToCharArray());
string X_Ip = "";
foreach (string ip in Ip_List)
{
string tmp = Convert.ToInt16(ip).ToString("x");
X_Ip += tmp;
}
long num = long.Parse(X_Ip, System.Globalization.NumberStyles.HexNumber);
string aConnStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("ipaddress.mdb");
System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(aConnStr);
System.Data.OleDb.OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
con.Open();
cmd.CommandText = "select top 1 country,city from dv_address where ip1 <=" + num + " and ip2 >=" + num;
string result = cmd.ExecuteScalar().ToString();
con.Close();
Response.Write(result);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
有了127.0.0.1对应但是2130706433 ,所以你ping 127.0.0.1和ping 2130706433 效果是一样的
可能有人说为什么不直接转换,因为直接转换需要取位,很麻烦
测试结果:
首先准备一个IP。例如在控制台里输入cmd,然后跟中一个网站,例如
tracert http://www.cnblogs.com
可以得到它的IP为 219.232.228.156
然后你可以到 http://www.ip138.com/ 查询其对应的地址
然后在适用上面程序进行验证是否正确。
在适用上面代码时,请注意下载需要数据库。(可以到动网论坛里下载 www.dvbbs.net)