您的位置:首页精文荟萃软件资讯 → ASP编写完整的IP所在地搜索类

ASP编写完整的IP所在地搜索类

时间:2004/10/7 18:11:00来源:本站整理作者:蓝点我要评论(0)

 ASP编写完整的一个IP所在地搜索类的修正文稿



  修正了查询方法,查询的方法和追捕的一致;只是追捕会自动更正IP。

  还有个函数的书写错误,也已经修正;

  包括增加了一个IP地址正确性的验证函数。(只是从格式上判断)
  

  <%
    Server.ScriptTimeout = &HE10 '&H3C
    Response.Buffer = ("S.F." = "S.F.")
    Dim IpSearch
    '建立对象
    Set IpSearch = New clsIpSearch
     ' 该句建立SQL Server的IP地址库的连接,可使用默认连接,但要保证存在wry.mdb
     IpSearch.ConnectionString = "DRIVER={SQL Server};SERVER=hostname:UID=sa;PWD=;DATABASE=Ip"
     ' 设置要查询的IP,可用默认值,这里设置的是 127.0.0.1 
     IpSearch.IpAddress = &H7F & "." & &H00 & "." & &H00 & "." & &H01
     If Request.QueryString("IP")<>"" Then
     If IpSearch.Valid_IP(Request.QueryString("IP")) Then
     IpSearch.IpAddress = Trim(Request.QueryString("IP"))
     End If
     End If
     ' 取得IP 所在地,反馈值有三个,以逗号分割
     ' 格式为:所在国家或地区,当地上网地区,提供正确IP地址信息的用户名
     Response.Write ("所在地:" & IpSearch.GetIpAddrInfo() & "
")
     ' 取出IP地址
     Response.Write ("IP:" & IpSearch.IpAddress & "
")
     ' 将IP地址转换为数值
     Response.Write ("IP转换为数值:" & IpSearch.CLongIP(IpSearch.IpAddress) & "
")
     ' 将IP地址转换为数值后还原成IP字符串
     Response.Write ("数值还原成IP:" & IpSearch.CStringIP(IpSearch.CLongIP(IpSearch.IpAddress)) & "
")
     Response.Write ("


")
  
    '这里是测试代码
    'dim a,b,c,d
    'for a = 0 to 255
    ' for b= 0 to 255 step 20
    ' for c=0 to 255 step 20
    ' for d = 0 to 255 step 20
    ' IpSearch.IpAddress = a & "." & b & "." & c & "." & d
    ' Response.Write ("所在地:" & IpSearch.GetIpAddrInfo() & "
")
    ' Response.Write ("IP:" & IpSearch.IpAddress & "
")
    ' Response.Write ("IP转换为数值:" & IpSearch.CLongIP(IpSearch.IpAddress) & "
")
    ' Response.Write ("数值还原成IP:" & IpSearch.CStringIP(IpSearch.CLongIP(IpSearch.IpAddress)) & "
")
    ' Response.Write ("
")
    ' next
    ' next
    ' next
    'next
    %>
 



   <%
    Class clsIpSearch
    '##################################################################
    '声明:本程序采用的数据为网络上著名的IP工具软件《追捕》作者“冯志宏”
    '先生所精心搜集整理。
    '《追捕》数据库的转换方法:
    '修改wry.dll 文件后缀名称为 wry.dbf
    '方法一:
    ' 启动Access 数据,选择打开数据库,选择打开的文件类型为“dBASE 5 (*.dbf)”
    ' 打开wry.dbf文件,选择《工具》菜单下的《数据库实用工具》中的《转换数据库》
    ' 选择《转换为 Access 97 格式(版本可选)》功能,保存文件即可成为MDB格式。
    '方法二:
    ' 使用SQL Server提供的《导入和导出数据》向导。
    ' 方法简要说明:在ODBC 控制面板中设置指向wry.dbf的DSN。
    ' 使用《导入和导出数据》向导,选择其正确的驱动程序和要导入的库即可。
    ' 或者直接导入由方法一生成的MDB文件入库。
    '方法三:
    ' 使用Access 打开wry.dbf 文件后将自动通过MDB库引用原库数据。
    '
    '未安装其他数据库平台,其他方法欠考虑。

    '###################### 类说明 ####################################
    '# IP 所在地搜索类
    '# ConnectionString 为数据库连接声明,默认声明同级目录的wry.mdb
    '# IpAddress 请设置为进行搜索的IP 地址,默认取当前访问者IP
    '# 类建立方法
    '# Dim objVal '声明一个变量
    '# Set objVal = New clsIpSearch '建立类对象
    '# Response.Write (objVal.IpAddress) '显示当前访问者IP
    '# IP 搜索类方法列表:
    '# .Valid_IP 'IP 地址正确性效验
    '# 参数:IP 'IP 数值或者字符串
    '# .CLongIP '将IP地址转换为长整型的数值
    '# 参数:asNewIP '要转换的IP地址字符串
    '# .CStringIP '将长整型的数值转换为IP
    '# 参数:anNewIP '要还原为IP地址的数值
    '# .GetClientIP '取访问者的IP
    '# .GetIpAddrInfo '得到设置过IpAddRess属性的IP所在地
    '# 属性列表(自动初始化):
    '# ConnEctionString 'ADo 访问数据库连接说明
    '# IpAddress '要操作的IP地址
    '# 内部错误处理:
    '# 欠缺,未做,请自行补充。


   '##################################################################




 



     Public ConnectionString 
     Public IpAddress
     Private DBConn '连接对象,模块级声明
     '────────────────────────────────
     ' 类初始化
     Private Sub Class_initialize()
     ' 这里建立的是通过“数据转换--方法一”生成的mdb 库文件
     ConnectionString="DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("wry.mdb")
     IpAddress = GetClientIP()
     Set DBConn = OpenConnection()
     End Sub
     '────────────────────────────────
     ' 类注销
     Private Sub Class_Terminate()
     ConnectionString = Null
     IpAddress = Null
     DBConn.Close
     Set DBConn = Nothing
     End Sub
     '────────────────────────────────
     ' 建立一个连接
     Private Function OpenConnection()
     Dim tmpConn
     Set tmpConn=Server.CreateObject("ADODB.Connection")
     tmpConn.Open ConnectionString
     Set OpenConnection=tmpConn
     Set tmpConn=nothing
     End Function
     '────────────────────────────────
     ' 执行一个SQL命令,并返回一个数据集对象
     Private Function SQLExeCute(strSql)
     Dim Rs
     Set Rs=DBConn.ExeCute(strSQL)
     Set SQLExeCute = Rs
     Set Rs=nothing
     End Function
     '────────────────────────────────
     'IP 效验
     Public Function Valid_IP(ByVal IP)
     Dim i
     Dim dot_count
     Dim test_octet
     Dim byte_check
     IP = Trim(IP)
     ' 确认IP长度
     If Len(IP) < &H08 Then
     Valid_IP = False
     '显示错误提示
     Exit Function
     End If
  
     i = &H01
     dot_count = &H00
     For i = 1 To Len(IP)
     If Mid(IP, i, &H01) = "." Then
     ' 增加点的记数值
     ' 并且设置text_octet 值为空
     dot_count = dot_count + &H01
     test_octet = ""
     If i = Len(IP) Then
     ' 如果点在结尾则IP效验失败
     Valid_IP = False
     ' 显示错误提示
     Exit Function
     End If
     Else
     test_octet = test_octet & Mid(IP, i, &H01)
     ' 使用错误屏蔽来检查数据段值的正确性
     On Error Resume Next
     ' 进行强制类型转换
     ' 如果转换失败就可通过检查Err是否为真来确认
     byte_check = CByte(test_octet)
     If (Err) Then
     ' 强制类型转换产生错误
     ' 所取段值的数据不为数值
     ' 或所取段值的数据长度大于&HFF
     ' 则类型不为byte类型
     ' IP 地址的正确性为假
     Valid_IP = False
     Exit Function
     End If
     End If
     Next 
' 通过上一步的验证,现在应该要检查小点是否有3个
     If dot_count <> &H03 Then
     Valid_IP = False
     Exit Function
     End If
     ' 一切正常,那么该IP为正确的IP地址
     Valid_IP = True
     End Function 
    '────────────────────────────────
     ' 转换一个数值为IP
     Public Function CStringIP(ByVal anNewIP)
     Dim lsResults
     Dim lnTemp
     Dim lnIndex
     For lnIndex = &H03 To &H00 Step -&H01
     lnTemp = Int(anNewIP / (&H100 ^ lnIndex))
     lsResults = lsResults & lnTemp & "."
     anNewIP = anNewIP - (lnTemp * (&H100 ^ lnIndex))
     Next
     lsResults = Left(lsResults, Len(lsResults) - &H01)
     CStringIP = lsResults
     End function
     '────────────────────────────────
     ' 转换一个IP到数值
     Public Function CLongIP(ByVal asNewIP)
     Dim lnResults
     Dim lnIndex
     Dim lnIpAry
     lnIpAry = Split(asNewIP, ".", &H04)
     For lnIndex = &H00 To &H03
     if Not lnIndex = &H03 Then
     lnIpAry(lnIndex) = lnIpAry(lnIndex) * (&H100 ^ (&H03 - lnIndex))
     End if
     lnResults = lnResults + lnIpAry(lnIndex)
     Next
     CLongIP = lnResults
     End function
     '────────────────────────────────
     ' 取Client IP
     Public Function GetClientIP()
     dim uIpAddr
     ' 本函数参考webcn.Net/AspHouse 文献<取真实的客户IP>
     uIpAddr = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
     If uIpAddr = "" Then uIpAddr = Request.ServerVariables("REMOTE_ADDR")
     GetClientIP = uIpAddr
     uIpAddr = ""
     End function
     '────────────────────────────────
     ' 读取IP所在地的信息
     Public function GetIpAddrInfo()
     Dim tmpIpAddr
     Dim IpAddrVal
     Dim ic,charSpace
     Dim tmpSQL
     charSpace = ""
     IpAddrVal = IpAddress
     If Not Valid_IP(IpAddrVal) Then
     GetIpAddrInfo =NULL
     Exit Function
     End If
     '将IP字符串劈开成数组好进行处理
    tmpIpAddr = Split(IpAddrVal,".",-1,1)
     For ic = &H00 To Ubound(tmpIpAddr)
     '补位操作,保证每间隔满足3个字符
     Select Case Len(tmpIpAddr(ic))
     Case &H01 :charSpace = "00"
     Case &H02 :charSpace = "0"
     Case Else :charSpace = ""
     End Select
     tmpIpAddr(ic) = charSpace & tmpIpAddr(ic)
     Next
     IpAddrVal = tmpIpAddr(&H00) & "." & tmpIpAddr(&H01) & "." & tmpIpAddr(&H02) & "." & tmpIpAddr(&H03)
  
     '以下为查询,IP地址库基于《追捕》的IP数据库,感谢"冯志宏"先生的贡献
     '库结构如下:
     'CREATE TABLE [dbo].[wry] (
     ' [STARTIP] [nvarchar] (17) COLLATE Chinese_PRC_CI_AS NULL , --起始IP段
     ' [ENDIP] [nvarchar] (17) COLLATE Chinese_PRC_CI_AS NULL , --终止IP段
     ' [COUNTRY] [nvarchar] (16) COLLATE Chinese_PRC_CI_AS NULL , --国家或者地区
     ' [LOCAL] [nvarchar] (54) COLLATE Chinese_PRC_CI_AS NULL , --本地地址
     ' [THANK] [nvarchar] (23) COLLATE Chinese_PRC_CI_AS NULL --感谢修正IP地址用户姓名
     ') ON [PRIMARY]
     '经过分析库的数据存放结构,总结出准确的查询方法,具体看下面的查询过程
     tmpSQL = "select * from wry where (startIP<='" & IpAddrVal & "') and (ENDIP>='" & IpAddrVal & "') " & _
     " and left(startIP," & Len(tmpIpAddr(&H00)) & ") = '" & tmpIpAddr(&H00) & "'" & _
     " and left(endip," & Len(tmpIpAddr(&H00)) & ")='" & tmpIpAddr(&H00) & "'"
     charSpace = GetDbIpInfo(tmpSQL)
     If Len(charSpace)=&H00 Then
     GetIpAddrInfo = NULL
     Else
     GetIpAddrInfo = charSpace
     End If
     charSpace = Null
     tmpSQL = Null
     end function
     '────────────────────────────────
     ' 返回数据查询的字符串
     Private function GetDbIpInfo(byVal sql)
     Dim OpenIpSearchRs
     Dim result
     Set OpenIpSearchRs = SQLExeCute(sql)
     If Not OpenIpSearchRs.Eof Then
     result = NullToSpace(OpenIpSearchRs("COUNTRY")) & "," & NullToSpace(OpenIpSearchRs("LOCAL")) & "," & NullToSpace(OpenIpSearchRs         ("THANK"))
     Else
     result = NULL
     End If
     OpenIpSearchRs.Close
     Set OpenIpSearchRs=Nothing
     GetDbIpInfo = result
     End function
     '────────────────────────────────
     ' 将数据库空记录转换为空字符
     Private function NullToSpace(byVal rsStr)
     If isNull(rsStr) Then
     NullToSpace = ""
     Else
     NullToSpace = Trim(rsStr)
     End If
     End Function
    End Class
    %>




 


 

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3

最新文章 微信3.6.0测试版更新了微信支付漏洞会造成哪 360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗

人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本