全球ip地址查询完整版
突然在某某网站看到ip地址查询,于是心血来潮做了一个。这是用asp查询全球ip地址的程式,由于类似的的用asp查询ip的速度不是很理想,本人使用的也是宏志宏的ip地址数据库,只是对它进行了改进。
本人在 win98+pws+access2000上测试通过,效果比较理想。
数据库的设计在一个软件中的比例,毫不夸张的说占60%,虽然这是一个小的程式,但也得到一定的体现。
有任何错误或建议请一定要给我发e-mail: ljz811@163.com ,我也不了解“追捕”等类似算法,欢迎交流,谢谢!
好了废话少说,开始吧。
1、 转wry.dll为.mdb由于我们要优化数据库(适合我们用的),建议这样做:
将文件改为wry.xls用excel打开。
在access中新建表ip
字段名 类型 长度 说明
————————————————————————————————————
id 自动编号
newid 数字 5 startip前三个数字
seconded 数字 5 startip第二部分三个数字
startip 文本 20 起始ip段
endip 文本 20 止 ip 段
country 文本 此段ip所在国家或省
local 文本 此段ip所在地
从excel中copy startip/endip/country/local 四个字段至access ,id会自动添加,对于newid和secondid当然我们不可能手工添加,可以这样实现。
<!–#include file="dbpath.asp"–>
<%
sqlcmd="select * from ip"
‘建议使用sqlcmd="select * from ipwhere id>=值1 and id<值2" ,因为对于一万个左右的数据一下子添加资源占用很大
set rs=ip.execute(sqlcmd)
do while not rs.eof
fir=left(rs("startip"),3)
sec=mid(rs("startip"),5,3)
sqlcmd3="update ip set newid="&str&",secondid="sec" "
ip.execute sqlcmd3
rs.movenext
loop
%>
这样就完成数据库的修改,对于dbpath.asp 文件下面讲
2、 文件介绍
本程序分 dbpath.asp 和 search.asp
以下是源程序及简要描述
dbpath.asp 代码如下:(本人命名数据库名字为ip.mdb)
<%@ language=vbscript %>
<% set ip=server.createobject("adodb.connection")
ip.open "driver={microsoft access driver (*.mdb)};dbq=" & server.mappath("ip.mdb") %>
search.asp 代码如下:
<!–#include file="dbpath.asp"–>
<%
write by 尥蹶子
if you find some error or you have better idea
please contact me
my email: ljz811@163.com oicq:30763914
%>
<%
建立一个提交的表单
%>
<body bgcolor=azure>
<p align=center>ip查询<br><br><br>
<form action="index.asp" method=post id=form1 name=form1>
<font size=2>输入ip:</font><input id=text1 name=putip
style ="background-color: lavender; height: 22px; width: 182px" >
<input id=submit1 name=sub1 style="background-color: lightblue; font-size: 12" type=submit value="我查" tabindex="0">
</form>
<%
userip=request.servervariables ("remote_addr")
listip=trim(request("putip"))
if listip="" or listip=" " then
response.write "<p align=center><font size=2>请输入ip地址!</font></p>"
else
—判断访问者的ip是否与输入的ip同
cmp=strcomp(userip,listip,1)
if cmp=0 then %>
<p align=center><font size=2 >这就是你自己呀!</p>
<%
else
获得输入ip的第1段,并置3位
num1=instr(listip,".")
判断第一段是否正确
if mun1=1 then
response.write "<p align=center>"&listip&"<br>"&" <font size=2 >非有效的ip地址,ip每段必须1~3位!</p>"
else
fir=left(listip,num1-1)
if len(fir)=2 then
fir=0&fir
end if
if len(fir)=1 then
fir=0&fir
fir=0&fir
end if
获得输入ip的第2段,并置3位
num2=instr(num1+1,listip,".")
sec=mid(listip,num1+1,num2-(num1+1))
if len(sec)=2 then
sec=0&sec
end if
if len(sec)=1 then
sec=0&sec
sec=0&sec
end if
获得输入ip的第3段,并置3位
num3=instr(num2+1,listip,".")
thr=mid(listip,num2+1,num3-(num2+1))
if len(thr)=2 then
thr=0&thr
end if
if len(thr)=1 then
thr=0&thr
thr=0&thr
end if
获得输入ip的第4段,并置3位
fou=right(listip,len(listip)-num3)
if len(fou)=2 then
fou=0&fou
end if
if len(fou)=1 then
fou=0&fou
fou=0&fou
end if
判断是否为有效ip
if len(fir)=0 or len(fir)>3 or len(sec)=0 or len(sec)>3 or len(thr)=0 or len(thr)>3 or len(fou)=0 or len(fou)>3 then
response.write "<p align=center>"&listip&"<br>"&" <font size=2 >非有效的ip地址,ip每段必须1~3位!</p>"
else
判断是否为保留地址
if ((fir>=0) and (fir<= 2)) or ((fir>=58) and (fir<=60)) or ((fir>=67) and (fir<=126)) then
response.write "<p align=center>"&listip&"<br>"&" <font size=2 >internet ip保留地址!</p>"
else
判断是否为分配地址
if (fir>=219 and fir<=223) or fir=225 then
response.write "<p align=center>"&listip&"<br>"&" <font size=2 >此ip地址尚未分配!</p>"
else
if fir>255 or fir<0 or sec>255 or sec<0 or thr>255 or thr<0 or fou>255 or fou<0 then
response.write "<p align=center>"&listip&"<br>"&" <font size=2 >internet ip地址输入值不正确!</p>"
else
查询ip地址数据库
set sql= server.createobject("adodb.recordset")
rs1="select id,startip,endip,country,local from ip where id<9904 and newid="&fir&" and secondid="&sec&" "
sql.open rs1,ip,1,1
对于类似224.000.000.000~224.255.255.255的ip地址进行处理
if sql.recordcount = 1 then
sql.close
sqlcmd2="select id,startip,endip,country,local from ip where id<9904 and newid="&fir&" and secondid="&sec&" order by id desc"
set rs=ip.execute(sqlcmd2)
else
sqlcmd2="select id,startip,endip,country,local from ip where id<9904 and newid="&fir&" order by id desc"
set rs=ip.execute(sqlcmd2)
if rs.eof then
%>
<br><br><font size="2"><p align=center><%=listip%><br>★未知ip数据★<br>如果你知道请告诉我!oicq:30763914 谢谢!<br>=尥蹶子=</font></p>
<% else
do while not rs.eof
*******处理country or local为空的情况,使用了按id倒排(why?因为根据ip地址表可知,先列大地区的ip段,例如先列出欧洲的062.000.000.000~062.255.255.255,再列英国等ip段)
对后面三段ip进行处理,是否在ip表内
if (sec>=(mid(rs("startip"),5,3)) and (sec<=mid(rs("endip"),5,3))) and (thr>=(mid(rs("startip"),9,3)) and (thr<=mid(rs("endip"),9,3))) and (fou>=(mid(rs("startip"),13,3)) and (fou<=mid(rs("endip"),13,3))) then
%>
<center><font size=2><%=listip%><br><%=rs("country")%> <%=rs("local")%></font></center>
<%
若查到数据,马上跳出以免占用资源
exit do
else
end if
if rs.eof then
如果没有打出提示
%>
<br><br><font size="2"><p align=center><%=listip%><br>★未知ip数据★<br>如果你知道请告诉我!oicq:30763914 谢谢!<br>=尥蹶子=</font></p>
<%
end if
rs.movenext
loop
end if
end if
%>
<%
end if
end if%>
<%end if%>
<%end if%>
<%end if%>
<%end if%><%end if%>
</body>
</html>
