如何检查inputIP落在特定的IP范围内
如果我们让用户input几个IP范围,例如172.16.11.5 – 100,我怎么能写一个函数来检查一个IP(172.16.11.50)是否在这个范围内?
.NET中有没有现有的库可以利用?
框架中没有任何东西,但是创build一个IPAddressRange
类并不需要太多的工作。
您可以通过在较低地址,较高地址和比较地址上调用IPAddress.GetAddressBytes来比较范围。 从第一个字节开始,检查比较地址是否在上/下地址范围内。
此方法适用于IPv4和IPv6地址。
public class IPAddressRange { readonly AddressFamily addressFamily; readonly byte[] lowerBytes; readonly byte[] upperBytes; public IPAddressRange(IPAddress lowerInclusive, IPAddress upperInclusive) { // Assert that lower.AddressFamily == upper.AddressFamily this.addressFamily = lowerInclusive.AddressFamily; this.lowerBytes = lowerInclusive.GetAddressBytes(); this.upperBytes = upperInclusive.GetAddressBytes(); } public bool IsInRange(IPAddress address) { if (address.AddressFamily != addressFamily) { return false; } byte[] addressBytes = address.GetAddressBytes(); bool lowerBoundary = true, upperBoundary = true; for (int i = 0; i < this.lowerBytes.Length && (lowerBoundary || upperBoundary); i++) { if ((lowerBoundary && addressBytes[i] < lowerBytes[i]) || (upperBoundary && addressBytes[i] > upperBytes[i])) { return false; } lowerBoundary &= (addressBytes[i] == lowerBytes[i]); upperBoundary &= (addressBytes[i] == upperBytes[i]); } return true; } }
注意:上面的代码可以扩展为添加公共静态工厂方法FromCidr(IPAddress address, int bits)
对于任何人在这个问题上检查:
你可能想通过@jsakamoto来考虑这个库,这似乎工作得很好:
https://github.com/jsakamoto/ipaddressrange
它也可以通过NuGet安装:
最好的办法是将这些地址转换为整数,然后执行比较。
从这里的例子: IP到整数
要将IP地址转换为整数,请将其分成四个八位字节。 例如,您提供的IP地址可以分解为:
First Octet: 217 Second Octet: 110 Third Octet: 18 Fourth Octet: 206
要从虚线string计算小数地址,请执行以下计算。
(first octet * 256³) + (second octet * 256²) + (third octet * 256) + (fourth octet) = (first octet * 16777216) + (second octet * 65536) + (third octet * 256) + (fourth octet) = (217 * 16777216) + (110 * 65536) + (18 * 256) + (206) = 3647869646
考虑到IPv6,你可以将它们转换成整数(128bit比32bit IPv4)。 看看这个问题: 在C#中将IPv6格式化为一个int,并将其存储在SQL Server中
最简单的路线是让框架为你做这个。 使用
IPAddress.Parse
parsing地址,然后使用IPAddress.GetAddressBytes
来获取“number”作为byte[]
。
public static bool IsInRange(string startIpAddr, string endIpAddr, string address) { long ipStart = BitConverter.ToInt32(IPAddress.Parse(startIpAddr).GetAddressBytes().Reverse().ToArray(), 0); long ipEnd = BitConverter.ToInt32(IPAddress.Parse(endIpAddr).GetAddressBytes().Reverse().ToArray(), 0); long ip = BitConverter.ToInt32(IPAddress.Parse(address).GetAddressBytes().Reverse().ToArray(), 0); return ip >= ipStart && ip <= ipEnd; //edited } Console.WriteLine(IsInRange("100.0.0.1", "110.0.0.255", "102.0.0.4"));//true
我之前在codeproject上使用了这个代码,这对你可能是有用的。
从这里重新发布我的答案
前一阵子,我不得不find一个给定IP的位置。 我们从请求中获得了IP。 有免费的数据库给了我们这个映射。 在IPv4中,当我们将IP称为“abcd”时,它本质上是a *(256 ^ 3)+ b *(256 ^ 2)+ c *(256)+ d。
http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp
(256 * 256)(256 ^ 2)(b = 256)+ 256 *(256)之间的IP地址)(c = 256)+ 256(d = 256)(根据是否要包含/排除限制,下限/上限可能有所不同)。
也就是说,为特定目的保留了特定的IP(例如127.0.0.1是localhost,0.0.0.0不能是IP等)。
所以你的linq查询将会是
“从我在iList里i> = MIN && i <= MAX select i;”
其中iList是您的初始列表MIN是您的范围的最小值MAX是您的范围的最大值
你能找出你的IP范围的子网掩码吗?
如果是这样,那么也许你可以使用这个IsInSameSubnet方法..
- 升级到.NET 4.5后,iFrameparsing器错误
- MVC2中的Html.Partial(view,model)和Html.RenderPartial(view,model)之间有什么区别(如果有的话)?
- 如何在asp.net中创build持久性cookie?
- 如何强制BundleCollection刷新MVC4中的caching脚本包
- 用gridview asp.netsorting和分页
- 从URL下载/stream文件 – asp.net
- 新的asp.net图表控件 – 他们将使用MVC(最终)?
- IIS应用程序池,工作进程,应用程序域
- 如何将除Web API之外的其他一切路由到/index.html