电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> ASP
用asp判断某IP是否属于某网段的另类算法-ASP教程,ASP技巧
作者:网友供稿 点击:5
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
 

有时候我们需要判断某一个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.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·如何使XP的目录属性出现"安全"选项-ASP教程,系统相关
·创建有个性的对话框之MFC篇(二)-ASP教程,系统相关
·用InstallShield打包ASP程序-ASP教程,ASP应用
·windows server 2003 中 SQL Server 2000 分布式事务 错误解决方法-ASP教程,系统相关
·创建有个性的对话框之MFC篇(一)-ASP教程,系统相关
·DevExpress打印相关代码-ASP教程,打印相关
·File文件控件,选中文件(图片,flash,视频)即立即预览显示-ASP教程,组件开发
·用Windows的文件映射机制,实现大批量数据的快速存储-ASP教程,系统相关
·ADO如何取得数据库中表的字段信息之一
·使用DEVEXPRESS部件打印时标题的处理-ASP教程,打印相关

最新文章
· SQL注入天书 - ASP注入漏洞全接触
·用.net 处理xmlHttp发送异步请求
·asp.net创建文件夹的IO类的问题
·如何实现ASP.NET网站个性化
·关于ASP.NET调用JavaScript的实现
·ASP利用Google实现在线翻译功能
·Asp无组件生成缩略图
·由HTTP 500 Internal server error想到的...
·实例讲解asp抓取网上房产信息
·改mdb为asp所带来的灾难


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号