国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

判斷,IP的來源是電信還是網通

2019-11-02 15:47:52
字體:
來源:轉載
供稿:網友

  判斷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(ar

幽默笑話[www.62-6.com/1/gaoxiaoduanzi/]
r(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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南乐县| 车致| 抚顺县| 海城市| 鄂伦春自治旗| 甘谷县| 武强县| 新巴尔虎左旗| 台湾省| 奎屯市| 沙坪坝区| 乌苏市| 四平市| 临邑县| 保德县| 河池市| 江山市| 九龙县| 宁南县| 马公市| 文水县| 宣化县| 庆阳市| 迁安市| 瑞昌市| 老河口市| 周宁县| 平潭县| 贺州市| 芜湖市| 德保县| 清水河县| 临夏市| 富源县| 敦煌市| 毕节市| 永德县| 永新县| 霍城县| 康平县| 美姑县|