2010-11-23 5 views
1

Je travaille sur un projet qui nécessite la possibilité de travailler avec des adresses MAC et IP. Dans ce projet particulier, j'ai une mesure et des limites supérieures et inférieures pour la comparer à, c'est-à-dire que la mesure doit être dans la plage des limites supérieure/inférieure. La mesure et les limites supérieures/inférieures peuvent toutes deux être des adresses MAC, des adresses IP, des hexs, des bin, etc. Est-il possible de vérifier par programme si une adresse MAC/IP se trouve dans une plage particulière? À ce stade, je suppose que je devrais convertir l'adresse MAC ou IP en hexadécimal ou binaire et à une comparaison de cette façon. N'importe quelles autres suggestions sont les bienvenues. MISE À JOUR: En utilisant l'information du lien alexn fourni, j'ai implémenté la classe de Richard Szalay pour vérifier les plages d'adresses IP ci-dessous pour tous ceux qui en ont besoin.Travailler avec les adresses MAC et IP en C#

/// <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 - Merci pour votre aide, je travaillerai sur une classe similaire pour les adresses MAC mettant en œuvre les méthodes que vous avez décrites. Je peux éliminer les classes, en faveur de votre approche minimaliste, dans les itérations ultérieures.

+0

uniquement IPv4 ou IPv6 aussi? – CodesInChaos

Répondre

1

Je suis venu avec l'exemple suivant.

Une méthode pour convertir des adresses IP en nombres à cette fin est facilement trouvée, j'ai donc inclus le lien dans la méthode dont je l'ai dérivé. J'utilise Regular Expressions pour tester si les données d'entrée correspondent à un modèle, n'hésitez pas à les omettre ou à les modifier selon vos besoins. (Par exemple, les adresses MAC de style Unix utilisent les deux-points (:) au lieu des tirets (-).)

Pour convertir les adresses MAC, je supprime simplement le délimiteur et j'analyse toute la chaîne comme un entier long. Dans mon exemple, j'indique les nombres convertis par plusieurs adresses IP et MAC. Vous pouvez donc définir les limites supérieure et inférieure et tester diverses combinaisons.

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); 
} 

Donc, pour utiliser ces méthodes, il vous suffit d'effectuer quelques comparaisons sur les valeurs converties:

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

Voici une belle classe développée par Richard Szalay ici chez StackOverflow dans une autre question.

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

C'est une classe agréable et vous permet de vérifier wheter une adresse IP est dans une plage spécifiée.

Avez-vous besoin de vérifier MAC et IP?

+0

Merci alexn, chaque mesure sera soit un MAC ou IP, donc je vais devoir comparer les deux. Comme je l'ai mentionné, je cherche à convertir chaque octet dans le MAC en binaire et ensuite faire une comparaison de cette façon. – kingrichard2005

Questions connexes