2010-11-23 122 views
1

我正在开发一个需要能够使用MAC和IP地址的项目。在这个特定的项目中,我有一个测量值和一个上限和下限来比较它,即测量值必须在上限/下限范围内。测量和上/下限可以是MAC地址,IP地址,十六进制,二进制等。是否可以通过编程检查MAC/IP地址是否在特定范围内?在这一点上,我猜我必须将MAC或IP地址转换为十六进制或二进制,并进行比较。欢迎任何其他建议。在C中使用MAC和IP地址

更新:使用来自alexn提供的链接的信息,我实现了Richard Szalay的类来检查下面的IP地址范围,以供其他需要它的人使用。

/// <summary> 
    /// Used for evaluating IPAddress ranges. Class courtesy of Richard Szalay's solution on http://stackoverflow.com/questions/2138706/c-how-to-check-a-input-ip-fall-in-a-specific-ip-range 
    /// </summary> 
    class IPAddressRange 
    { 
     private Byte[] _upperBytes, _lowerBytes; 
     private AddressFamily _addressFamily; 

     public IPAddressRange(IPAddress upper, IPAddress lower) 
     { 
      this._addressFamily = lower.AddressFamily; 
      this._upperBytes = upper.GetAddressBytes(); 
      this._lowerBytes = lower.GetAddressBytes(); 
     } 

     public Byte[] upperBytes 
     { 
      get { return _upperBytes; } 
      set { this._upperBytes = value; } 
     } 

     public Byte[] lowerBytes 
     { 
      get { return _lowerBytes; } 
      set { this._lowerBytes = value; } 
     } 

     /// <summary> 
     /// Determines if the IPAddress is within the range of the upper and lower limits defined in this class instance 
     /// </summary> 
     /// <param name="address">An address to check against pre-defined upper and lower limits</param> 
     /// <returns>True, if it's within range, false otherwise.</returns> 
     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; 
     } 
    } 

@JYelton - 感谢您的帮助,我将在MAC地址类似的类上实现您所描述的方法。在稍后的迭代中,我可能会消除这些类,赞成你的极简主义方法。

+0

只有IPv4或IPv6的也? – CodesInChaos 2010-11-23 19:46:00

回答

1

我想出了下面的例子。

为了达到这个目的,我们很容易找到一种将IP地址转换为数字的方法,所以我将链接包含在我从它派生出的方法中。

我使用正则表达式来测试输入数据是否匹配模式,随意忽略或根据需要进行更改。 (例如,Unix风格的MAC地址使用冒号(:)而不是连字符( - ))。

要转换MAC地址,我只是省略了分隔符并将整个字符串解析为长整型。

在我的示例中,我显示了几个示例IP和MAC地址转换的数字,因此您可以定义上限和下限并测试各种组合。

using System.Globalization; 
using System.Text.RegularExpressions; 

string IP_UpperLimit = "192.168.1.255"; 
string IP_LowerLimit = "192.168.1.1"; 
string Mac_UpperLimit = "99-EE-EE-EE-EE-EE"; 
string Mac_LowerLimit = "00-00-00-00-00-00"; 

string IP_WithinLimit = "192.168.1.100"; 
string IP_OutOfBounds = "10.10.1.1"; 

string Mac_WithinLimit = "00-AA-11-BB-22-CC"; 
string Mac_OutOfBounds = "AA-11-22-33-44-55"; 

Console.WriteLine("IP Addresses:"); 
Console.WriteLine("Upper Limit: " + ConvertIP(IP_UpperLimit)); 
Console.WriteLine("Lower Limit: " + ConvertIP(IP_LowerLimit)); 
Console.WriteLine("IP_WithinLimit: " + ConvertIP(IP_WithinLimit)); 
Console.WriteLine("IP_OutOfBounds: " + ConvertIP(IP_OutOfBounds)); 
Console.WriteLine(); 
Console.WriteLine(); 

Console.WriteLine("Mac Addresses:"); 
Console.WriteLine("Upper Limit: " + ConvertMac(Mac_UpperLimit)); 
Console.WriteLine("Lower Limit: " + ConvertMac(Mac_LowerLimit)); 
Console.WriteLine("Mac_WithinLimit: " + ConvertMac(Mac_WithinLimit)); 
Console.WriteLine("Mac_OutOfBounds: " + ConvertMac(Mac_OutOfBounds)); 


long ConvertIP(string IP) 
{ 
    // http://www.justin-cook.com/wp/2006/11/28/convert-an-ip-address-to-ip-number-with-php-asp-c-and-vbnet/ 
    Regex r = new Regex(@"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"); 
    if (!r.Match(IP).Success) return 0L; 
    string[] IPSplit = IP.Split('.'); 
    long IPNum = 0L; 
    for (int i = IPSplit.Length - 1; i >= 0; i--) 
     IPNum += ((Int64.Parse(IPSplit[i]) % 256) * (long)Math.Pow(256, (3 - i))); 
    return IPNum; 
} 

long ConvertMac(string Mac) 
{ 
    Regex r = new Regex(@"^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$"); 
    if (!r.Match(Mac).Success) return 0L; 
    return Int64.Parse(Mac.Replace("-", String.Empty), NumberStyles.HexNumber); 
} 

所以,要利用这些方法,你只是转换值进行一番比较:

bool IPIsGood = ConvertIP(IP_UpperLimit) >= ConvertIP(IP_Test) && 
    ConvertIP(IP_LowerLimit) <= ConvertIP(IP_Test); 
1

这是Richard Szalay在另一个问题的StackOverflow中开发的一个很好的类。

How to check a input IP fall in a specific IP range

这是一个很好的类,并允许你检查wheter的IP是在规定范围内。

你需要检查MAC和IP吗?

+0

感谢alexn,每次测量都将是一个MAC或IP,所以我将不得不比较两者。正如我所提到的,我正在考虑将MAC中的每个八位字节转换为二进制,然后通过这种方式进行比较。 – kingrichard2005 2010-11-23 17:57:56