使用.NET测试IP地址是否在一定范围内

4

.NET有IP地址范围的概念吗?

我需要测试一个给定的IP地址是否在一组地址范围内。

我可以编写一些API,例如:

IPRange ipRange = IPRange.Parse("127.0.0.1-127.0.0.15");
ipRange.Contains(someAddress);

但是如果已经有类似的功能内置,我就不想重新发明轮子了。


4
你可以将IP地址转换为数字来验证范围。请参阅https://dev59.com/7XRB5IYBdhLWcg3w77kn。 - George Johnston
2个回答

5
不是,但以下是如何实现的(使用VB,因为代码标签未包含在原始帖中)。
'test values
Dim rangeStart As Net.IPAddress = Net.IPAddress.Parse("192.168.133.1")
Dim rangeEnd As Net.IPAddress = Net.IPAddress.Parse("192.168.133.254")
Dim check As Net.IPAddress = Net.IPAddress.Parse("192.168.133.230")

'get the bytes of the address
Dim rbs() As Byte = rangeStart.GetAddressBytes
Dim rbe() As Byte = rangeEnd.GetAddressBytes
Dim cb() As Byte = check.GetAddressBytes

'reverse them for conversion
Array.Reverse(rbs)
Array.Reverse(rbe)
Array.Reverse(cb)

'convert them
Dim rs As UInt32 = BitConverter.ToUInt32(rbs, 0)
Dim re As UInt32 = BitConverter.ToUInt32(rbe, 0)
Dim chk As UInt32 = BitConverter.ToUInt32(cb, 0)

'check
If chk >= rs AndAlso chk <= re Then
    Debug.WriteLine("In Range")
Else
    Debug.WriteLine("Not In Range")
End If

2
它几乎解决了我的问题,如果我定义IP范围为“192.168.*.*”,现在我想比较“192.168.133.230”怎么办? - dIvYaNsH sInGh
2
如果你想表达以192.168开头的所有地址,那么起始地址是192.168.0.0,结束地址是192.168.255.255。 - dbasnett

0

这里是关于 dbasnett's answer 的快速翻译,适用于 C#:

public static bool IsIPInRange(string ip, string ipStart, string ipEnd)
{
    var pIP = IPAddress.Parse(ip);
    var pIPStart = IPAddress.Parse(ipStart);
    var pIPEnd = IPAddress.Parse(ipEnd);

    var bIP = pIP.GetAddressBytes().Reverse().ToArray();
    var bIPStart = pIPStart.GetAddressBytes().Reverse().ToArray();
    var bIPEnd = pIPEnd.GetAddressBytes().Reverse().ToArray();

    var uIP = BitConverter.ToUInt32(bIP, 0);
    var uIPStart = BitConverter.ToUInt32(bIPStart, 0);
    var uIPEnd = BitConverter.ToUInt32(bIPEnd, 0);

    return uIP >= uIPStart && uIP <= uIPEnd;
}

这是一个带有示例的.NET Fiddle完全工作。希望这不算偏题回答。

在第pIP.GetAddressBytes().Reverse().ToArray()行出现错误。错误信息为:重载决策失败,因为没有可访问的'Reverse'接受此数量的参数。 - NoName
@PhucNguyen 只需添加 using System.Linq; 来调用 此方法 即可。 - Uwe Keim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接