C#.net ip限止问题

作者&投稿:国钟 (若有异议请与网页底部的电邮联系)
C#.NET 如何获得本机IP地址?~


首先是你得知道内蒙古的IP段,好吧我们先假设58.18.135.*是赤峰的IP段,当然肯定不止这么少,你自己去查下赤峰 IP段,这不重要,重要是解决问题的办法:
你直接把IP取出来装在String变量里,也就是先定义一个string变量接IP段
string strIP = 什么什么什么;//取IP地址,我不知道你什么途径取得的,自己写
//然后把String按照"."分割装在string数组里
char[] separator = { ',' };
String[] chStrIP = new String[4];//因为IP段都是被"."分成4部分
chStrIP = strIP.Split(separator);
//再然后你把string 数组转成int型的
int[] chIntIP = new int[4];
for(int i=0;i<4;i++)
{
int.TryParse(chStrIP[i], out chIntIP[i]);
}
然后你就可以把chIntIP[0],chIntIP[1],chIntIP[2],chIntIP[3]取出来了,都是听话的整形,想怎么判断怎么判断,只要你知道赤峰的代码区间或者代码段,这问题就解决了,我解释的这么好,多给点分吧,再问不难,哈哈

看看这个:
http://www.cnblogs.com/fanfajin/archive/2007/10/24/935383.html

然后自己做一个数据表,IpTable表
字段:
IP(string 类型) rule(bool类型)

做一个函数返回规则表
public IList<string) GetIpRuleList()
{

这里查询IP表中所有数据。
string sql="select * from IPTable"
.... 根据你的数据库建立数据连接,用DataReader查询数据
IList<string> ipList=new List<string>();
while(reader.Read())
{
iplist.Add(reader["IP"].ToString()+":"+reader["Rule"].ToString())
}
reader.Close();
...
return iplist;

}
//根据IP判断是不是能通过验证
public bool VaildIp(string ip)
{
IList<string> iplist=GetIpRuleList();
foreach(string rule in iplist)
{
if(IsAllowIP(rule, ip)) return true;
}
return false;
}
#region 验证在IP范围内是否允许
/// <summary>
/// 判断指定的IP是否在指定的 规则下允许的(三个特殊符号 -?*)
/// rule[192.*.1.236-239:yes;192.*.1.226:no;218.85.*.*:no]最后一个不要加";"分号
/// 前面的规则优先级高
/// 注意,规则中的 * - ? 不能同时存在于同一个段内 如: 192.168.*?.123 会出错
/// *号在同一段内只能有一个, 如 192.16*.1.*, 192.1**.1.1 是错误的,可以用 ?号代替
/// </summary>
/// <param name="rule">(192.*.1.236-239:yes;192.*.1.226:no;218.85.*.*:no) 最后一个规则不要再多加";"分号</param>
/// <param name="ip">192.168.1.237(不正确的IP会出错)</param>
/// <returns></returns>
public static bool IsAllowIP(string rule, string ip)
{
//IP正则表达式
string ipRegexString = @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$";
//如果IP地址是错的,禁止
if (!Regex.IsMatch(ip, ipRegexString))
{
throw new Exception("参数ip错误:错误的IP地址" + ip);
}
else
{
//分离规则
string[] ruleArray = rule.Split(new char[] { ';' });
string[] ipdata = ip.Split(new char[] { '.' });
bool retValue = false;//默认返回值

//遍历规则并验证
foreach (string s in ruleArray)
{
bool IsFind = false;
string[] data = s.Split(new char[] { ':' });
//如果没有用:分开
if (data.Length != 2) { throw new Exception("请用:分开 如:192.168.1.1:yes"); }

string ruleIp = data[0];//得到 192.168.20-60.*:yes 中的 [192.168.20-60.*]部分
retValue = data[1].ToString().ToLower() == "yes" ? true : false;

string[] ruleIpArray = ruleIp.Split(new char[] { '.' });
if (ruleIpArray.Length != 4) { throw new Exception("IP部分错误!"); }

#region
for (int i = 0; i < 4; i++)
{
bool AA = ruleIpArray[i].Contains("*");
bool BB = ruleIpArray[i].Contains("-");
bool CC = ruleIpArray[i].Contains("?");
if ((AA && BB) || (AA && CC) || (BB && CC) || (AA && BB && CC))
{
throw new Exception("这样的格式是错误的,192.168.15-20*,*与-不能包含在同一个部分! ");
}
else if (!AA && !BB && !CC) //没有包含 * 与 - 及 ?
{
if (!Regex.IsMatch(ruleIpArray[i], @"^2[0-4]\d|25[0-5]|[01]?\d\d?$"))
{
throw new Exception("IP段错误应该在1~255之间:" + ruleIpArray[i]);
}
else
{
#region 这里判断 111111111111
if (ruleIpArray[i] == ipdata[i])
{
IsFind = true;
}
else
{
IsFind = false;
break;
}
#endregion
}
}
else if (AA && !BB && !CC) //包含 [*] 的
{
if (ruleIpArray[i] != "*")
{
if (ruleIpArray[i].StartsWith("*") || !ruleIpArray[i].EndsWith("*") || ruleIpArray[i].Contains("**"))
{
throw new Exception("IP中的*部分:不能以*开头,不能有两个**,只能以*结尾");
}
}
else
{
#region 这里判断22222222222222
if (ipdata[i].StartsWith(ruleIpArray[i].Replace("*", "")))
{
IsFind = true;
}
else
{
IsFind = false;
break;
}
#endregion
}
}
else if (BB && !AA && !CC) //包含 [-] 的
{

string[] temp = ruleIpArray[i].Split(new char[] { '-' });
if (temp.Length != 2)
{
throw new Exception("IP段错误, 如:23-50,在1~255之间");
}
else
{
if (Convert.ToInt32(temp[0]) < 1 || Convert.ToInt32(temp[1]) > 255)
{
throw new Exception("IP段错误, 如:23-50,在1~255之间");
}
else
{
#region 这里判断33333333333333333
string[] Num = ruleIpArray[i].Split(new char[] { '-' });
int p = int.Parse(ipdata[i]);
if (p >= int.Parse(Num[0]) && p <= int.Parse(Num[1]))
{
IsFind = true;
}
else
{
IsFind = false;
break;
}
#endregion
}
}
}
else if (CC && !AA & !BB) //包含 [?] 的
{
//去掉问号后
string temp = ruleIpArray[i].Replace("?", "");
Regex re = new Regex(@"^\d\d?$");
if (!re.IsMatch(temp) || temp.Length > 2)
{
throw new Exception("IP段错误:" + ruleIpArray[i]);
}
else
{
#region 这里判断4444444444444
if (ruleIpArray[i].Length != ipdata[i].Length)
{
IsFind = false;
break;
}
else
{
string tempRegstring = "^" + ruleIpArray[i].Replace("?", @"\d") + "$";
Regex tempRe = new Regex(tempRegstring);
if (tempRe.IsMatch(ipdata[i]))
{
IsFind = true;
}
else
{
IsFind = false;
break;
}
}
#endregion
}
}
else
{
IsFind = false;
break;
}

}
#endregion
if (IsFind)
{
return retValue;//IP规则中 :后面的 yes/no 对应的 true false
}
}
return false;

}
}
#endregion

}

使用时:在Page_Load里
string ip=Request.UserHostAddress;
if(!VaildIp(ip))
{
Response.Write("你的IP禁止访问");
Response.End();
//或者:Response.Redirect("no.aspx");

string ClientIP;
ClientIP=Request.UserHostAddress
if (ClientIP=="192.168.4.25")
{
Response.Redirect("http://禁止登录");
}
else
{
Response.Redirect("http://可以登录");
}

C表示什么意思?
答:用C表示的是组合算法,C62(6在下,2在上)的算法为 下方的6作为分母进行阶乘,上方的2作为分母6的阶乘个数,以及作为分子进行阶乘 若用A62(6在下,2在上)则为排列算法,即:此时上方的2只作为下方6阶乘的个数,不再作为分子进行阶乘。

网络用语中c是什么意思
答:网络语言是由网民创造、常用于网上交流、不同于传统语言的新型语言——网络语言正在风行全球。网络语言是时代发展过程中一种特定的语言现象,更是网络时代的特别产物。开车原意是指驾驶车辆的人群,但是逐渐衍生成另外一种意思。那么,网络用语“开车”什么意思啊?下面不妨跟着小编一起去看看吧。1、现在常指...

排列组合的C是什么?
答:C是组合:比如ABC中选2个组合。那么AB,BA算一种组合,一共有AB,AC,BC三种组合。P是排列:(人教版把P写成A) 比如从ABC中选两个排列,那么AB,BA算两种组合,一共有AB BA AC,CA,BC,CB六种排列。从n个不同元素中,任取m(m≤n,m与n均为自然数)个元素按照一定的顺序排成一列,叫做...

数学符号。这个C是什么符号?
答:数学符号,这个C式组合数,在线性写法中被写作C(n,m)。组合数的计算公式为 n 元集合 A 中不重复地抽取 m 个元素作成的一个组合实质上是 A 的一个 m 元子集和。如果给集 A 编序 成为一个序集,那么 A 中抽取 m 个元素的一个组合对应于数段 到序集 A 的一个确定的严格保序映射。组合...

排列组合中的C表示什么意思?
答:排列组合中的C表示组合数,它表示从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。排列组合中的C计算公式为:C(n,m)=n!/(m!(n-m)...

在c语言中,c++与++c有什么区别
答:在c语言里++c的意思是将c的值+1后提取c的值,c++的意思是先提取c的值后将c的值+1。例:1、int c=0;printf("%d\n",++c);//c的值和输出结果都为1。2、int i,j=0;i=j++; //此时,i=0,因为j++先赋值,后加,所以j本身已经变成1了。3、int c=0;printf("%d\n",c++); //...

排列组合c是什么意思?
答:A上3下3是3的全排名,C上2下4是4选2的排列。排列组合c的公式:C(n,m)=A(n,m)/m!=n!/m!(n-m)!与C(n,m)=C(n,n-m)。(n为下标,m为上标)。例如,C(4,2)=4!/(2!*2!)=4*3/(2*1)=6;C(5,2)=C(5,3)。排列组合是组合学最基本的概念。所谓排列,就是指从...

C³₆等于多少
答:已知:角PAE=10度角BAE=70度角PBD=20度角ABD=60度 求:角DEA=C=?解:以PB为边向左作等边三角形PBF,连接EF,以EF为边向下作等边三角形EFG,连接AF,DF,AG 所以PF=PB=BF 角BPF=角PFB=角PBF=60度 FE=FG=EG 角EFG=角FEG=角FGE=60度 因为角PAB=角PAE+角BAE 角PAE=10度 角BAE=70度...

排列组合问题, C³ⁿ
答:答案是10,Cₙᵐ=Cₙⁿ⁻ᵐC₅³=5×4×3/3×2×1=10。以下是排列组合的相关介绍:排列组合是组合学最基本的概念。所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素中仅仅取出指定个数的元素,不...

C-CUP什么意思?
答:C杯,杯罩的尺寸之。A杯,B杯,C杯...指的是罩杯的大小,对应的是乳房大小。而1/2罩杯,3/4罩杯,全罩杯等指的就是罩杯的外形设计。罩杯的大小就是上胸围减去下胸围的差,一般来说,在10cm左右选择A罩杯,12.5cm左右选择B罩杯,15cm左右选择C罩杯,17.5cm左右选择D罩杯,20cm左右选择E罩杯,...