ASP編寫完整的IP所在地搜尋類

來源:互聯網
上載者:User

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() & "<br>")
     ' 取出IP地址
     Response.Write ("IP:" & IpSearch.IpAddress & "<br>")
     ' 將IP地址轉換為數值
     Response.Write ("IP轉換為數值:" & IpSearch.CLongIP(IpSearch.IpAddress) & "<br>")
     ' 將IP地址轉換為數值後還原成IP字串
     Response.Write ("數值還原成IP:" & IpSearch.CStringIP(IpSearch.CLongIP(IpSearch.IpAddress)) & "<br>")
     Response.Write ("<hr>")
  
    '這裡是測試代碼
    '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() & "<br>")
    ' Response.Write ("IP:" & IpSearch.IpAddress & "<br>")
    ' Response.Write ("IP轉換為數值:" & IpSearch.CLongIP(IpSearch.IpAddress) & "<br>")
    ' Response.Write ("數值還原成IP:" & IpSearch.CStringIP(IpSearch.CLongIP(IpSearch.IpAddress)) & "<br>")
    ' Response.Write ("<hr>")
    ' 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命令,並返回一個資料集對象
 &bsp;   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 & "') " &ap; _
     " 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
    %>

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.