国产精品一品二品_49vv亚洲_亚洲美女激情视频_国产成人亚洲无吗淙合青草_欧美在线天堂_人妻av无码av中文av日韩av_av在线播放免费_91亚洲精品在线观看_韩国 欧美 日产 国产精品_久久人人爽

在線客服:  

「南寧煙寒網絡」提供南寧網站建設、網站策劃、南寧網頁制作、網站設計、網站改版、南寧SEO優化、網站維護、南寧網站優化、南寧網站推廣、廣告設計等服務..

咨詢熱線

在線客服

24小時免費咨詢電話:18978941786

客服時間:上午9:30~下午6點

當前位置:首頁>> 技術文章 >> ASP學習 >> asp判斷某IP是否屬于某網段的算法

asp判斷某IP是否屬于某網段的算法

收藏 分享 發布日期:2012-2-12 16:30:50    編輯:admin  文章來源:  點擊率:

有時候我們需要判斷某一個ip地址是否屬于一個網段,以決定該用戶能否訪問系統.
比如用戶登錄的IP是218.6.7.7,而我們的程序必須判斷他是否屬于218.6.0.0/16這個網段(其中/16是新的子網掩碼的表示方式,相當于255.255.0.0).
要實現這樣的功能,現在流行的算法是將218.6.0.0和218.6.7.7按256進制換算成10進制并進行比較得出,如先計算出218.6.0.0和218.6.255.255的十進制:218×256×256×256+6×256×256=3657826304,218×256×256×256+6×256×256+255×256×256+255=3657891839。再計算出218.6.7.7的十進:218×256×256×256+6×256×256+7×256+7=3657828103,最后再比較3657828103是否大于等于3657826304和小于等于3657891839。但明顯有一個問題,計算量非常多,值非常大,如果IP地址是61開頭的還好,如果是218開頭的,這將會造成數據溢出而出錯。
其實比較IP是否屬于某一網段,最好的方式就是將IP與網段分別轉為32位二進制,再比較他們的網絡部分是否相同就可以了.asp本身不具備位運行功能,所以要實現這個只有我們手工實現,具體如下:
'將十進制轉為二進制字符串
function dec2bin(octNumber)
vara=octNumber
do
dec2bin=cstr(vara mod 2) & dec2bin
vara=vara 2
loop until vara=0
end function

'將二進制字符串填充為8位
function pad(str)
pad=right("00000000" & str,8)
end function

'判斷是否是一個IP地址
function isIp(ipadd)
isIp=false
set oReg=new RegExp
oReg.IgnoreCase=true
oReg.global=true
oReg.Pattern="(d{1,4}.d{1,4}.d{1,4}.d{1,4})|(d{1,4}.d{1,4}.d{1,4}.d{1,4}/d{1,2})"
if oReg.test(ipadd) then isIp=true
set oReg=nothing
end function

'其中UserIP是我們要檢測的IP
'NetIP是要檢測的網段或某個IP,用xxx.xxx.xxx.xxx/N來表示網段,其中N表示子網掩碼位數
'注,該程序是環球萬維原創程序,所以如果您要轉載,請保留出處信息,謝謝.
'程序設計:環球萬維,專業提供域名注冊,虛擬主機服務
'網址:http://www.netInter.cn
'以上信息與文章正文是不可分割的一部分,所以如果您要轉載本文章,您必須保留以上信息.

Function check_ip(UserIp,NetIP)
currentip=UserIp
collection_ips=split(iplist,",") '將網絡按點分割成4段
check_ip=false '初始函數值,false假設IP不在這網段
NetIP=trim(NetIP)
slashPos=inStr(NetIP,"/")
if slashPos=0 then '網段沒含有/符號,他只是一個IP,所以比較比個字符串是否相同就可以了
if NetIP=currentip then
check_ip=true 'check_ip=true表示IP相等
exit function
end if
else
netRang=mid(NetIP,slashPos+1) '得到/后邊的數字
if not isNumeric(netRang) then '/后邊不是數字,格式不正確
exit function
end if
netRang=cint(netRang) '將字符轉為數字
if netRang>31 then
exit function '/后的數字不能超過32位
end if
ipsets=split(currentip,".") '將用戶IP按點分成四段

C_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets(2))) & pad(dec2bin(ipsets(3)))
'上邊這行是將用戶IP地址手工轉換為對應的一個32個字符長的二進制
ipsets=split(NetIP,".") '按上邊的過程將網段IP同樣轉為32個字符長的二進制
sPos=instr(ipsets(3),"/") '最后一點格式應該是 數字/數字
if sPos=0 then
exit function
end if
ipsets(3)=left(ipsets(3),sPos-1) '得到最后一段/前邊的數字
S_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets(2))) & pad(dec2bin(ipsets(3)))
'將其轉換為32個字符長的二進制
if left(C_IP_BIN,netRang) = left(S_IP_BIN,netRang) then '比較網段絡是否相同就可以判斷用戶IP否屬于某個網段了
check_ip=true
end if
end if
end function

應用舉例:

要判斷61.139.1.1是否在61.139.0.0/16 (255.255.0.0)這個網段
只需要簡單的使用這個函數就可以了,如:

if check_ip("61.139.1.1","61.139.0.0/16") then
Response.write "同一網段"
else
Response.write "不是同一網段"
end if

本文章由南寧網站建設南寧網站優化南寧網絡公司整理,轉載請注明出處:http://www.hjnf.com.cn/

南寧煙寒網絡竭誠為您免費提供南寧網站建設南寧網站設計南寧網站優化、維護以及網站技術很方面的網絡服務!

南寧網站建設南寧網絡公司咨詢熱線電話:0771-5306126 18967841786(24小時全天電話)

煙寒網絡 - 讓你進一步走向成功

主站蜘蛛池模板: 嘉祥县| 青铜峡市| 万载县| 开化县| 宁武县| 麦盖提县| 平果县| 子洲县| 怀仁县| 依兰县| 垣曲县| 福贡县| 永州市| 庆安县| 疏附县| 桐梓县| 肥东县| 长武县| 津市市| 博客| 鱼台县| 张掖市| 界首市| 杭州市| 韶山市| 团风县| 杨浦区| 汉沽区| 房产| 仁怀市| 崇义县| 互助| 麻栗坡县| 芜湖市| 南宁市| 金塔县| 玛多县| 台北市| 伊宁县| 庄浪县| 天峨县|