如何检查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安装:

http://www.nuget.org/packages/IPAddressRange/

最好的办法是将这些地址转换为整数,然后执行比较。

从这里的例子: 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.Parseparsing地址,然后使用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上使用了这个代码,这对你可能是有用的。

http://www.codeproject.com/KB/IP/ipnumbers.aspx

从这里重新发布我的答案

前一阵子,我不得不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方法..