- Login
帳號:
密碼:
ASP MENU
線上教學
   ASP 教學
VB.NET 教學
JSP 教學
JAVA 教學
完整 ASP 教學
程式下載
   ASP 程式下載
提供 ASP 程式
程式量身訂做
   收費標準
填寫需求表
討論交流專區
   程式討論區
電腦資訊交流
工作機會
   社會人就職情報
汎亞人力銀行
大台中人力銀行
大高雄人力銀行
相關連結
   ASP 虛擬空間
ASP 相關網站
聯絡我們
   意見信箱
加入會員程式討論區線上購物回首頁
ASP 教學
ASP編寫完整的一個IP所在地搜索類
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>")

'這堿O測試代碼
'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()
' 這堳堨萿漪O通過“數據轉換--方法一”生成的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
%>




頂端
本網頁最佳瀏覽模式為:瀏覽器 IE4.0 以上    解析度: 800 x 600
Copyright © 2000-2017 COOLASP All Rights Reserved