判断IP的来源是电信还是网通

  判断ip的来源是电信还是网通,常用于站点的后台程序.典型的做法当然是查询数据库教程,数据库里保存着网通(或电信)的ip范围,然后通过范围搜索来决定该ip是否在网通(或电信)的区间内.不过每次都得查询数据库,效率显然很低.

  不多废话,直接开始说一种超快的算法吧.既然要极快,莫过于o(1)的复杂度,所以开辟一巨大的缓冲区,用经典的空间换时间,通过查表一步即可判定.那如何定义表的大小,还有key?先从cnc.txt这个文件看起.(http://www.3lian.com/)

  这个文件是中国网通的路由表.仔细观察下,不难发现掩码位数最高不超过24(即255.255.255.0).事实上24位的掩码是非常至少,毕竟一个网通的网段里只划分了256个ip,已是相当的少了.既然掩码位数最多只有24,所以ip的最后一位可以忽略不计,而ip的前3位共有256^3(=16m)的组合.所以将ip的前3位作为key,16m的表长度,正好定义出ip对应网段的表.可以形象如下表示:

  123.0.0.0/24 => table[123.0.0] = true

  202.0.0.0/16 => table[202.0.0] = true

  table[202.0.1] = true

  ...

  table[202.0.255] = true

  检测的时候取ip前3位,检测表中对应是否为true即可判断出此ip的类型.事实上,本例中ip只有电信和网通两种状态(非网通网段都当作电信),因此只需1bit即可保存每个记录.这时表占用的内存只需16m/8=2m.下面就用asp教程来实现这功能.

  首先将路由表转化成一个2m大小的缓存表.考虑到asp的运行速度,这里事先用c程序直接处理,然后保存为一个2m的二进制文件.asp通过adbdo.stream读取数据流,并缓存在appliction集合中.所谓的数据流其实也就是个byte()变量,可以通过midb,ascb这类二进制函数来处理.

  初始化函数:

  sub init()

  if lenb(application("cnc")) then

  exit sub

  end if

  with server.createobject("adodb.stream")

  .type = 1

  .open

  .loadfromfile server.mappath("cnc.dat")

  application("cnc") = .read

  .close

  end with

  end sub

  通过appliction集合的缓存,就不必每次都读取文件.2m大小的内存也是可以接受的.接着就是分析ip地址,将其前3位转换成一个数字,因为这里每个记录是按位(bit)保存的,所以还要整除8来对应到byte()的位置.最后通过mod运算对应到具体字节的具体bit上.听著有些复杂,不过实现起来确是相当的简单:

  function ipiscnc(ip)

  dim arr, val

  dim c

  arr = split(ip, ".")

  val = clng(arr(0)) * 65536 + clng(arr(1)) * 256 + clng(arr(2))

  c = ascb(midb(application("cnc"), val 8 + 1, 1))

  ipiscnc = _

  (c and 2^(val mod 8)) <> 0

  end function

  ipiscnc(ip),返回ip地址是否为网通.

  到此关键的两个函数就大功告成了,接着测试:

  sub main()

  on error resume next

  init()

  if err then

  response.write "系统错误: " & err.description

  exit sub

  end if

  dim ip

  ip = request.servervariables("remote_addr")

  if ipiscnc(ip) then

  response.write ip & "属于网通ip"

  else

  response.write ip & "属于电信ip"

  end if

  end sub

  main()

  考虑到init函数需要文件的读取,所以添加了错误捕捉.不过通常情况下ipiscnc是不会错误的,因为remote_addr返回的必然是个正确格式的ip.

  每当访问asp时,除了第一次需加载文件外,其余时候只需三四行代码既可以判定,真正实现了空间换时间.

时间: 2024-10-27 19:09:48

判断IP的来源是电信还是网通的相关文章

php判断ip黑名单程序代码实例

 这篇文章主要介绍了php判断ip黑名单程序代码实例,需要的朋友可以参考下 学校的新闻系统要求有些新闻只开放校内ip浏览,于是重写了一个代码来实现此功能,实现后的结果是,只要把允许访问的ip列入ip.txt这个文件中即可,同时支持c类ip,例如:   ip.txt 192.168 211.67.188 211.67.191.25 代码如下:    代码如下: /* * ip地址黑名单.白名单 * 判断访客地址的ip是否在ip.txt中,支持c类ip * By xhat */   $ip = $_

巧用PHP正则表达式判断IP地址

学习PHP时,你可能会遇到判断PHP正则表达式问题,这里将介绍PHP正则表达式问题的解决方法,在这里拿出来和大家分享一下.在一些查询网站和搜索引擎,常常用到判断某字符串是否为标准的IP地址. 比如在百度里搜索某IP地址,会显示该IP的信息,而不符合标准的IP地址是不显示IP信息的.这时就要判断该字符串是否为标准的IP了,最常用的方法是用PHP正则表达式判断.在网上搜了一些判断IP地址的正则,都是过于简单的,有的只是判断IP字段不大于255,其实还有很多需要判断的,比如只能是数字,且不能为负数,还

Shell脚本实现判断IP地址是否在一个ip段内代码分享

  这篇文章主要介绍了Shell脚本实现判断IP地址是否在一个ip段内代码分享,本文直接给出实现代码,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 cat ipcalc.sh #!/bin/bash IP=$1 if [ -z $IP ] then echo -e "e[31;42m sh ipcalc.sh IP e[0m" exit fi while read MASK do min=`/usr

PHP判断IP并转跳到相应城市分站的方法

 这篇文章主要介绍了PHP判断IP并转跳到相应城市分站的方法,实例分析了php解析URL及跳转的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了PHP判断IP并转跳到相应城市分站的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

php使用CURL伪造IP和来源实例详解

这篇文章主要介绍了php使用CURL伪造IP和来源的方法,以实例形式详细分析了CURL伪造IP和来源的原理与实现技巧,并补充说明了PHP中的CURL函数库常用函数,需要的朋友可以参考下       本文实例讲述了php使用CURL伪造IP和来源的方法.分享给大家供大家参考.具体分析如下: 伪造IP来源对于php来说是很简单的一件事情,我们只要利用了php的curl即可实现伪造IP来源的功能,IP地址你可以随便写. index.php实例代码如下: 代码如下: $ch = curl_init();

C#判断IP格式 获得当前客户端IP

  Visual C# IP相关操作类,获得当前客户端IP,判断IP格式,也就是检测是否是IP地址,一些关于IP的基本操作,欢迎C#新手参考: 01/// 02/// 获得当前页面客户端的IP 03/// 04/// 当前页面客户端的IP 05public static string GetIP() 06{ 07 string result = String.Empty; 08 result = HttpContext.Current.Request.ServerVariables["HTTP_

Shell脚本判断IP是否合法性(多种方法)

运维角度来说,写shell脚本经常会遇到判断输入的值是否合法,比如IP.邮件地址等.那么,根据自身写脚本中总结的判断IP合法性脚本分享给网友,遇到时能有所参考. 思路:IP由四位数字组成,以点分割,每个字段不能大于255,必须符合这种格式 方法1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #!/bin/bash # blog: http://lizhenliang.blog.51cto.com    function check_ip() 

服务器-用正则表达式判断 ip ,在线等

问题描述 用正则表达式判断 ip ,在线等 字符串 192.168.1.118:8083 用正则怎么判断,公司非得用动态IP,说项目上架要换服务器,等大神,求助 解决方案 正确性没有判断,只判断了格式 d{1,3}(.d{1,3}){3}:d+ 解决方案二: 判断ip的正则表达式正则表达式判断合法IP正则表达式 IP 解决方案三: 按照需求来说感觉楼主说的有问题,动态获取ip地址跟正则表达式没有关系

webrtc在电信和网通用户之间使用很卡

问题描述 webrtc在电信和网通用户之间使用很卡 求解决方案, 或者能不能使用JS代码把数据流经过云服务器进行转发一下?