本地是指:访问来自本机(127.0.0.1)或IP地址与服务器的相同,或与服务器在同一个局域网内。
一.首先用HttpRequest.IsLocal 属性。如果发出请求方的 IP 地址为 127.0.0.1,或者,如果请求的 IP 地址与服务器的 IP 地址相同,IsLocal 属性就会返回 true。
二.然后,将IP转化为float值,看是否在局域网保留IP的值的范围内。
三类局域网保留IP段:
Class A 10.0.0.0-10.255.255.255
Class B 172.16.0.0-172.31.255.255
Class C 192.168.0.0-192.168.255.255
计算出的值范围:
127.0.0.1 – 值 2130706432
10.0.0.0-10.255.255.255 值范围 167772160 -- 184549375
172.16.0.0-172.31.255.255 值范围 2886729728 – 2887778303
192.168.0.0-192.168.255.255 值范围 3232235520 – 3232301055
一.首先用HttpRequest.IsLocal 属性。如果发出请求方的 IP 地址为 127.0.0.1,或者,如果请求的 IP 地址与服务器的 IP 地址相同,IsLocal 属性就会返回 true。
二.然后,将IP转化为float值,看是否在局域网保留IP的值的范围内。
三类局域网保留IP段:
Class A 10.0.0.0-10.255.255.255
Class B 172.16.0.0-172.31.255.255
Class C 192.168.0.0-192.168.255.255
计算出的值范围:
127.0.0.1 – 值 2130706432
10.0.0.0-10.255.255.255 值范围 167772160 -- 184549375
172.16.0.0-172.31.255.255 值范围 2886729728 – 2887778303
192.168.0.0-192.168.255.255 值范围 3232235520 – 3232301055
IP值计算方法:
IP分为4段后,用256 ^ (4 - i - 1),四个值相加。数据类型应该为double,single类型当值大时精度不够。
代码
代码
/// <summary>
/// 根据一个IPV4地址生成一个IP值,如果地址错误,返回-1
/// 需要用double,如果用single后面的位数不准确,变成0了
/// by JasperZhu 20101108
/// </summary>
/// <param name="sIPAddress"></param>
/// <returns></returns>
public static double GetIPFloatValue(string sIPAddress)
{
double fIPValue = -1;
if (sIPAddress.Trim() == string.Empty) return -1;
string[] arrIPSec = sIPAddress.Split('.');
if (arrIPSec.Length != 4)
{
return -1;
}
else
{
for (int i = 0; i < arrIPSec.Length; i++)
{
int nowIPSec = -1;
try { nowIPSec = Convert.ToInt16(arrIPSec[i]); }
catch { }
if (nowIPSec != -1)
{
fIPValue += nowIPSec * System.Math.Pow(256, (4 - i - 1)); //用表达式(256 ^ (4 - i - 1))的结果是错的;
}
else
{
return -1;
}
}
return fIPValue;
}
}
/// 根据一个IPV4地址生成一个IP值,如果地址错误,返回-1
/// 需要用double,如果用single后面的位数不准确,变成0了
/// by JasperZhu 20101108
/// </summary>
/// <param name="sIPAddress"></param>
/// <returns></returns>
public static double GetIPFloatValue(string sIPAddress)
{
double fIPValue = -1;
if (sIPAddress.Trim() == string.Empty) return -1;
string[] arrIPSec = sIPAddress.Split('.');
if (arrIPSec.Length != 4)
{
return -1;
}
else
{
for (int i = 0; i < arrIPSec.Length; i++)
{
int nowIPSec = -1;
try { nowIPSec = Convert.ToInt16(arrIPSec[i]); }
catch { }
if (nowIPSec != -1)
{
fIPValue += nowIPSec * System.Math.Pow(256, (4 - i - 1)); //用表达式(256 ^ (4 - i - 1))的结果是错的;
}
else
{
return -1;
}
}
return fIPValue;
}
}
注意:C#中不支持直接用幂符号(^)计算表达式,应该用System.Math.Pow(x,y),如果强用计算出的是错误值。
另外,在SQL中也不支持幂符号(^)计算表达式,应该用power(x,y)。
代码
--error result
select 61*(256^3)+50*(256^2)+136*256+182
--1026721974
select 61*(power(256,3))+50*power(256,2)+136*256+182
--值较大时
select (cast(192 as float)*power(256,3) +168*power(256,2)+255*256+255)
select 61*(256^3)+50*(256^2)+136*256+182
--1026721974
select 61*(power(256,3))+50*power(256,2)+136*256+182
--值较大时
select (cast(192 as float)*power(256,3) +168*power(256,2)+255*256+255)