【问题标题】:Testing if an IP address is within a range of addresses with .NET使用 .NET 测试 IP 地址是否在地址范围内
【发布时间】:2011-09-30 12:12:26
【问题描述】:

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

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

我可以编写一些 API 来给我类似的东西

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

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

【问题讨论】:

标签: .net ip-address


【解决方案1】:

不,但可以这样做(VB 因为代码标签不包含在 OP 中)

'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

【讨论】:

  • 它几乎解决了我的问题,如果我将 IP 范围定义为“192.168.*.*”,现在我想比较“192.168.133.230”
  • 所以如果你想说出 192.168 中的所有地址。那么起点是 192.168.0.0 终点是 192.168.255.255
【解决方案2】:

这里只是将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;
}

这是full working .NET Fiddle 的示例。

希望这不是题外话。

【讨论】:

  • 行错误:pIP.GetAddressBytes().Reverse().ToArray();。消息:重载解析失败,因为没有可访问的“反向”接受此数量的参数。
  • @PhucNguyen 只需添加一个using System.Linq; 来拨打this method 应该会有所帮助。
猜你喜欢
  • 2013-08-22
  • 1970-01-01
  • 2017-05-21
  • 2017-05-28
  • 1970-01-01
  • 2011-08-21
  • 2022-07-22
  • 2018-01-09
  • 2012-11-07
相关资源
最近更新 更多