欢迎光临
我们一直在努力

ASP编写完整的IP所在地搜索类-ASP教程,ASP应用

建站超值云服务器,限时71元/月

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命令,并返回一个数据集对象

  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

  %>

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ASP编写完整的IP所在地搜索类-ASP教程,ASP应用
分享到: 更多 (0)