账号通
    

账号  

密码  

5329

查看

11

回复
主题:[分享]教你使用IPAddress.dat显示用户IP位置 [收藏主题] 转到:  
bestsky.cn 当前离线

306

主题

0

广播

1

粉丝
添加关注
级别:三年级

用户积分:2823 分
登录次数:201 次
注册时间:2006/10/15
最后登录:2009/5/18
bestsky.cn 发表于:2008/2/10 16:59:00   | 只看该作者 查看该作者主题 楼主 

科汛数据库里有个IPADDRESS.dat一直放在哪里没用,今天在网上找到了用法,大家可以试试

我自己修改了一些地方,自动显示来访者的位置,可用于需要显示访问者地域的地方,比如像网易的评论一样"网易四川成都网友",呵呵

调用方法为:

  1.在需要的页面顶部加:<!-- #include file="showip.asp" -->

  2.在该页面要调用处加代码:

         <%=GetAddress("")%> '引号内为空时获得当前访问者的IP
         <%=GetAddress("124.173.216.237")%> '引号内有IP时显示要查询的IP地址

使用时注意修改两处红色代码处的文件位置,

[把下面代码保存为showip.asp]:

<%
Public Function GetAddress(sip)
if sip="" then sip=Request.ServerVariables("REMOTE_ADDR")
If Len(sip) < 5 Then
  GetAddress = "未知"
  Exit Function
End If
On Error Resume Next
Dim Wry,IPType
Set Wry = New TQQWry
If Not Wry.IsIp(sip) Then
  GetAddress = " 未知"
  Exit Function
End If
IPType = Wry.QQWry(sip)
GetAddress = Wry.Country & " " & Wry.LocalStr
End Function

Class TQQWry
' ============================================
' 变量声名
' ============================================
Dim Country, LocalStr, Buf, OffSet
Private StartIP, EndIP, CountryFlag
Public QQWryFile
Public FirstStartIP, LastStartIP, RecordCount
Private Stream, EndIPOff
' ============================================
' 类模块初始化
' ============================================
Private Sub Class_Initialize
  On Error Resume Next
  Country   = ""
  LocalStr   = ""
  StartIP   = 0
  EndIP    = 0
  CountryFlag  = 0
  FirstStartIP  = 0
  LastStartIP  = 0
  EndIPOff   = 0
  QQWryFile = Server.MapPath("IPAddress.dat") 'IP库路径,要转换成物理路径
End Sub
' ============================================
' IP地址转换成整数
' ============================================
Function IPToInt(IP)
  Dim IPArray, i
  IPArray = Split(IP, ".", -1)
  FOr i = 0 to 3
   If Not IsNumeric(IPArray(i)) Then IPArray(i) = 0
   If CInt(IPArray(i)) < 0 Then IPArray(i) = Abs(CInt(IPArray(i)))
   If CInt(IPArray(i)) > 255 Then IPArray(i) = 255
  Next
  IPToInt = (CInt(IPArray(0))*256*256*256) + (CInt(IPArray(1))*256*256) + (CInt(IPArray(2))*256) + CInt(IPArray(3))
End Function
' ============================================
' 整数逆转IP地址
' ============================================
Function IntToIP(IntValue)
  p4 = IntValue - Fix(IntValue/256)*256
  IntValue = (IntValue-p4)/256
  p3 = IntValue - Fix(IntValue/256)*256
  IntValue = (IntValue-p3)/256
  p2 = IntValue - Fix(IntValue/256)*256
  IntValue = (IntValue - p2)/256
  p1 = IntValue
  IntToIP = Cstr(p1) & "." & Cstr(p2) & "." & Cstr(p3) & "." & Cstr(p4)
End Function
' ============================================
' 获取开始IP位置
' ============================================
Private Function GetStartIP(RecNo)
  OffSet = FirstStartIP + RecNo * 7
  Stream.Position = OffSet
  Buf = Stream.Read(7)






  EndIPOff = AscB(MidB(Buf, 5, 1)) + (AscB(MidB(Buf, 6, 1))*256) + (AscB(MidB(Buf, 7, 1))*256*256)
  StartIP  = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)
  GetStartIP = StartIP
End Function
' ============================================
' 获取结束IP位置
' ============================================
Private Function GetEndIP()
  Stream.Position = EndIPOff
  Buf = Stream.Read(5)
  EndIP = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)
  CountryFlag = AscB(MidB(Buf, 5, 1))
  GetEndIP = EndIP
End Function
' ============================================
' 获取地域信息,包含国家和和省市
' ============================================
Private Sub GetCountry(IP)
  If (CountryFlag = 1 or CountryFlag = 2) Then
   Country = GetFlagStr(EndIPOff + 4)
   If CountryFlag = 1 Then
    LocalStr = GetFlagStr(Stream.Position)
    ' 以下用来获取数据库版本信息
    If IP >= IPToInt("255.255.255.0") And IP <= IPToInt("255.255.255.255") Then
     LocalStr = GetFlagStr(EndIPOff + 21)
     Country = GetFlagStr(EndIPOff + 12)
    End If
   Else
    LocalStr = GetFlagStr(EndIPOff + 8)
   End If
  Else
   Country = GetFlagStr(EndIPOff + 4)
   LocalStr = GetFlagStr(Stream.Position)
  End If
  ' 过滤数据库中的无用信息
  Country = Trim(Country)
  LocalStr = Trim(LocalStr)
  If InStr(Country, "CZ88.NET") Then Country = "GZ110.CN"
  If InStr(LocalStr, "CZ88.NET") Then LocalStr = "GZ110.CN"






End Sub
' ============================================
' 获取IP地址标识符
' ============================================
Private Function GetFlagStr(OffSet)
  Dim Flag
  Flag = 0
  Do While (True)
   Stream.Position = OffSet
   Flag = AscB(Stream.Read(1))
   If(Flag = 1 or Flag = 2 ) Then
    Buf = Stream.Read(3)
    If (Flag = 2 ) Then
     CountryFlag = 2
     EndIPOff = OffSet - 4
    End If
    OffSet = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256)
   Else
    Exit Do
   End If
  Loop






  If (OffSet < 12 ) Then
   GetFlagStr = ""
  Else
   Stream.Position = OffSet
   GetFlagStr = GetStr()
  End If
End Function
' ============================================
' 获取字串信息
' ============================================
Private Function GetStr()
  Dim c
  GetStr = ""
  Do While (True)
   c = AscB(Stream.Read(1))
   If (c = 0) Then Exit Do






   '如果是双字节,就进行高字节在结合低字节合成一个字符
   If c > 127 Then
    If Stream.EOS Then Exit Do
    GetStr = GetStr & Chr(AscW(ChrB(AscB(Stream.Read(1))) & ChrB(C)))
   Else
    GetStr = GetStr & Chr(c)
   End If
  Loop
End Function
' ============================================
' 核心函数,执行IP搜索
' ============================================
Public Function QQWry(DotIP)
  Dim IP, nRet
  Dim RangB, RangE, RecNo






  IP = IPToInt (DotIP)






  Set Stream = CreateObject("ADodb.Stream")
  Stream.Mode = 3
  Stream.Type = 1
  Stream.Open
  Stream.LoadFromFile QQWryFile
  Stream.Position = 0
  Buf = Stream.Read(8)






  FirstStartIP = AscB(MidB(Buf, 1, 1)) + (AscB(MidB(Buf, 2, 1))*256) + (AscB(MidB(Buf, 3, 1))*256*256) + (AscB(MidB(Buf, 4, 1))*256*256*256)
  LastStartIP  = AscB(MidB(Buf, 5, 1)) + (AscB(MidB(Buf, 6, 1))*256) + (AscB(MidB(Buf, 7, 1))*256*256) + (AscB(MidB(Buf, 8, 1))*256*256*256)
  RecordCount = Int((LastStartIP - FirstStartIP)/7)
  ' 在数据库中找不到任何IP地址
  If (RecordCount <= 1) Then
   Country = "未知"
   QQWry = 2
   Exit Function
  End If






  RangB = 0
  RangE = RecordCount






  Do While (RangB < (RangE - 1))
   RecNo = Int((RangB + RangE)/2)
   Call GetStartIP (RecNo)
   If (IP = StartIP) Then
    RangB = RecNo
    Exit Do
   End If
   If (IP > StartIP) Then
    RangB = RecNo
   Else
    RangE = RecNo
   End If
  Loop






  Call GetStartIP(RangB)
  Call GetEndIP()

  If (StartIP <= IP) And ( EndIP >= IP) Then
   ' 没有找到
   nRet = 0
  Else
   ' 正常
   nRet = 3
  End If
  Call GetCountry(IP)

  QQWry = nRet
End Function
' ============================================
' 检查IP地址合法性
' ============================================
Public Function IsIp(IP)
  IsIp = True
  If IP = "" Then IsIp = False : Exit Function
  Dim Re
  Set Re = New RegExp
  Re.Pattern = "^(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])\.(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])$"
  Re.IgnoreCase = True
  Re.Global = True
  IsIp = Re.Test(IP)
  Set Re = Nothing
End Function
' ============================================
' 类终结

' ============================================
Private Sub Class_Terminate
  On ErrOr Resume Next
  Stream.Close
  If Err Then Err.Clear
  Set Stream = Nothing
End Sub
End Class
%>


[此贴子已经被作者于2008-2-11 11:21:21编辑过]

 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
sytbtc 当前离线

71

主题

0

广播

0

粉丝
添加关注
级别:学前班

用户积分:510 分
登录次数:34 次
注册时间:2007/11/15
最后登录:2012/9/7
sytbtc 发表于:2008/4/25 0:41:00   | 只看该作者 查看该作者主题 沙发 
太好了 kesion 有你 真不错
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
一生有你 当前离线

10439

主题

0

广播

18

粉丝
添加关注
级别:版主

用户积分:72521 分
登录次数:1969 次
注册时间:2006/7/1
最后登录:2021/8/25
一生有你 发表于:2008/2/14 12:16:00   | 只看该作者 查看该作者主题 藤椅 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
bestsky.cn 当前离线

306

主题

0

广播

1

粉丝
添加关注
级别:三年级

用户积分:2823 分
登录次数:201 次
注册时间:2006/10/15
最后登录:2009/5/18
bestsky.cn 发表于:2008/2/14 11:59:00   | 只看该作者 查看该作者主题 板凳 
科汛在线考试系统(NET)
这个就不用演示了吧
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
zhitaige 当前离线

1196

主题

0

广播

0

粉丝
添加关注
级别:八年级

用户积分:7830 分
登录次数:267 次
注册时间:2006/11/8
最后登录:2015/9/4
zhitaige 发表于:2008/2/11 11:21:00   | 只看该作者 查看该作者主题 报纸 
科汛在线商城系统(NET)

很不错

不知道有没有演示

 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
bestsky.cn 当前离线

306

主题

0

广播

1

粉丝
添加关注
级别:三年级

用户积分:2823 分
登录次数:201 次
注册时间:2006/10/15
最后登录:2009/5/18
bestsky.cn 发表于:2008/2/11 11:13:00   | 只看该作者 查看该作者主题 地板 
科汛在线考试系统(NET)
以下是引用人间极品在2008-2-11 1:32:59的发言:

顶一下!

如果能结合后台的访问统计显示出详细的用户访问地址就更好了!

后台哪个本来就能显示,用的就是这个代码,你只要找到admin/KS.Online.asp文件里大约469行处的

QQWryFile = Server.MapPath("../ks_data/IPAddress.Dat") 'QQ IP库路径,要转换成物理路径

改一下路径就能显示出来了,不用加其它的代码

 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
人间极品 当前离线

357

主题

2

广播

0

粉丝
添加关注
级别:三年级

用户积分:3898 分
登录次数:348 次
注册时间:2006/11/9
最后登录:2012/11/16
人间极品 发表于:2008/2/11 1:32:00   | 只看该作者 查看该作者主题 7楼 

顶一下!

如果能结合后台的访问统计显示出详细的用户访问地址就更好了!

 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
mbaun 当前离线

1138

主题

4

广播

1

粉丝
添加关注
级别:八年级

用户积分:6229 分
登录次数:342 次
注册时间:2006/4/4
最后登录:2023/2/2
mbaun 发表于:2008/2/10 17:02:00   | 只看该作者 查看该作者主题 8楼 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
keeper11 当前离线

148

主题

3

广播

0

粉丝
添加关注
级别:一年级

用户积分:1302 分
登录次数:218 次
注册时间:2008/3/16
最后登录:2020/4/26
keeper11 发表于:2011/8/10 23:00:59   | 只看该作者 查看该作者主题 9楼 
 
缩阴产品排行榜 http://suoyin999.com
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
kakajsl 当前离线

7

主题

0

广播

0

粉丝
添加关注
级别:学前班

用户积分:9 分
登录次数:3 次
注册时间:2011/8/27
最后登录:2011/9/25
kakajsl 发表于:2011/9/13 22:39:31   | 只看该作者 查看该作者主题 10楼 
 
  支持(0) | 反对(0) 回到顶部顶端 回到底部底部
<上一主题 | 下一主题 >
Powered By KesionCMS Version X1
厦门科汛软件有限公司 © 2006-2016 页面执行0.28125秒 powered by KesionCMS 9.0