全球IP地址查询完整版

突然在某某网站看到IP地址查询,于是心血来潮做了一个。这是用asp查询全球IP地址的程式,由于类似的的用Asp查询IP的速度不是很理想,本人使用的也是宏志宏的IP地址数据库,只是对它进行了改进。

本人在 win98+pws+access2000上测试通过,效果比较理想。

数据库的设计在一个软件中的比例,毫不夸张的说占60%,虽然这是一个小的程式,但也得到一定的体现。

有任何错误或建议请一定要给我发E-mail: [email protected] ,我也不了解“追捕”等类似算法,欢迎交流,谢谢!

好了废话少说,开始吧。

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当然我们不可能手工添加,可以这样实现。

 1   
 2  
 3sqlcmd="select * from ip"   
 4  
 5‘建议使用sqlcmd="select * from ipwhere id>=值1 and id<值2" ,因为对于一万个左右的数据一下子添加资源占用很大   
 6  
 7set rs=ip.execute(sqlcmd)   
 8  
 9do while not rs.eof   
10  
11fir=left(rs("startip"),3)   
12  
13sec=mid(rs("startip"),5,3)   
14  
15sqlcmd3="update ip set newid='"&str&"',secondid='"sec"' "   
16  
17ip.execute sqlcmd3   
18  
19rs.movenext   
20  
21loop   
22  

这样就完成数据库的修改,对于dbpath.asp 文件下面讲

2、 文件介绍

本程序分 dbpath.asp 和 search.asp

以下是源程序及简要描述

Dbpath.Asp 代码如下:(本人命名数据库名字为ip.mdb)

1@ Language=VBScript 
1 set ip=server.createobject("ADODB.CONNECTION")   
2  
3ip.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("ip.mdb") 

search.asp 代码如下:

 1   
 2  
 3' Write by 尥蹶子   
 4  
 5' If you find some error or you have better idea   
 6  
 7' Please contact me   
 8  
 9' My Email: [email protected] Oicq:30763914   
10  
1   
2  
3'建立一个提交的表单   
4  
 1<body bgcolor="azure">
 2<p align="center">IP查询<br/><br/><br/>
 3<form action="index.asp" id="form1" method="post" name="form1">
 4<font size="2">输入IP:</font><input id="text1" name="putip" style="BACKGROUND-COLOR: lavender; HEIGHT: 22px; WIDTH: 182px"/>    
 5  
 6<input id="submit1" name="sub1" style="BACKGROUND-COLOR: lightblue; FONT-SIZE: 12" tabindex="0" type="submit" value="我查"/>
 7</form>   
 8  
 9  
10  

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

1  
2<p align="center"><font size="2">这就是你自己呀!</font></p>   
3  

else

'获得输入ip的第1段,并置3位

num1=Instr(listip,".")

'判断第一段是否正确

if mun1=1 then

Response.Write "<p align="center">"&amp;listip&amp;"<br/>"&amp;" <font size="2">非有效的IP地址,IP每段必须1~3位!</font></p>"

else

fir=left(listip,num1-1)

if len(fir)=2 then

fir=0&amp;fir

end if

if len(fir)=1 then

fir=0&amp;fir

fir=0&amp;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&amp;sec

end if

if len(sec)=1 then

sec=0&amp;sec

sec=0&amp;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&amp;thr

end if

if len(thr)=1 then

thr=0&amp;thr

thr=0&amp;thr

end if

'获得输入ip的第4段,并置3位

fou=right(listip,len(listip)-num3)

if len(fou)=2 then

fou=0&amp;fou

end if

if len(fou)=1 then

fou=0&amp;fou

fou=0&amp;fou

end if

'判断是否为有效IP

if len(fir)=0 or len(fir)&gt;3 or len(sec)=0 or len(sec)&gt;3 or len(thr)=0 or len(thr)&gt;3 or len(fou)=0 or len(fou)&gt;3 then

Response.Write "<p align="center">"&amp;listip&amp;"<br/>"&amp;" <font size="2">非有效的IP地址,IP每段必须1~3位!</font></p>"

else

'判断是否为保留地址

if ((fir&gt;=0) and (fir&lt;= 2)) or ((fir&gt;=58) and (fir&lt;=60)) or ((fir&gt;=67) and (fir&lt;=126)) then

Response.Write "<p align="center">"&amp;listip&amp;"<br/>"&amp;" <font size="2">Internet IP保留地址!</font></p>"

else

'判断是否为分配地址

if (fir&gt;=219 and fir&lt;=223) or fir=225 then

Response.Write "<p align="center">"&amp;listip&amp;"<br/>"&amp;" <font size="2">此IP地址尚未分配!</font></p>"

else

if fir&gt;255 or fir&lt;0 or sec&gt;255 or sec&lt;0 or thr&gt;255 or thr&lt;0 or fou&gt;255 or fou&lt;0 then

Response.Write "<p align="center">"&amp;listip&amp;"<br/>"&amp;" <font size="2">Internet IP地址输入值不正确!</font></p>"

else

'查询IP地址数据库

Set sql= Server.CreateObject("ADODB.Recordset")

rs1="select id,startip,endip,country,local from ip where id&lt;9904 and newid="&amp;fir&amp;" and secondid="&amp;sec&amp;" "

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&lt;9904 and newid="&amp;fir&amp;" and secondid="&amp;sec&amp;" order by id desc"

set rs=ip.execute(sqlcmd2)

else

sqlcmd2="select id,startip,endip,country,local from ip where id&lt;9904 and newid="&amp;fir&amp;" order by id desc"

set rs=ip.execute(sqlcmd2)

if rs.eof then

1  
2<br/><br/><font size="2"><p align="center">```
3=listip
4```<br/>★未知IP数据★<br/>如果你知道请告诉我!OICQ:30763914 谢谢!<br/>=尥蹶子=</p></font></p>   
5  

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&gt;=(mid(rs("startip"),5,3)) and (sec&lt;=mid(rs("endip"),5,3))) and (thr&gt;=(mid(rs("startip"),9,3)) and (thr&lt;=mid(rs("endip"),9,3))) and (fou&gt;=(mid(rs("startip"),13,3)) and (fou&lt;=mid(rs("endip"),13,3))) then

1  
2<center><font size="2">```
3=listip
4```<br/>```
5=rs("country")
6```  ```
7=rs("local")
8```</font></center>   
9  

'若查到数据,马上跳出以免占用资源

exit do

else

end if

if rs.eof then

'如果没有打出提示

1  
2<br/><br/><font size="2"><p align="center">```
3=listip
4```<br/>★未知IP数据★<br/>如果你知道请告诉我!OICQ:30763914 谢谢!<br/>=尥蹶子=</p></font>   
5  

end if

rs.movenext

loop

end if

end if

1  
2  
3  
4  
5  

end if

end if

1  

end if

1  

end if

1  

end if

1  

end if

1end if
2```   
3  
4&lt;/body&gt;
5```
Published At
Categories with Web编程
Tagged with
comments powered by Disqus