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

  次阅读 作者:智能小宝 来源:互联网 2016-03-01 13:07 我要评论(0)

判断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"

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...