2010-11-23 6 views
1

Ich arbeite an einem Projekt, das die Fähigkeit erfordert, mit MAC und IP-Adressen zu arbeiten. In diesem speziellen Projekt habe ich eine Messung und eine obere und untere Grenze, um sie zu vergleichen, d. H. Die Messung muss innerhalb des Bereichs der oberen/unteren Grenzen liegen. Sowohl die Messung als auch die oberen/unteren Grenzwerte können MAC-Adressen, IP-Adressen, Hexadezimalwerte, Bin usw. sein. Ist es möglich, programmatisch zu prüfen, ob eine MAC/IP-Adresse innerhalb eines bestimmten Bereichs liegt? An dieser Stelle würde ich wahrscheinlich die MAC- oder IP-Adresse entweder in Hex oder Binär konvertieren und so vergleichen. Alle anderen Vorschläge sind willkommen.Arbeiten mit MAC und IP-Adressen in C#

UPDATE: Mithilfe der Informationen von dem Link, den alexn zur Verfügung gestellt hat, habe ich Richard Szalays Klasse implementiert, um nach IP-Adressbereichen für jeden zu suchen, der sie benötigt.

/// <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 - Vielen Dank für Ihre Hilfe, ich auf eine ähnliche Klasse für MAC-Adressen funktionieren die Methoden der Umsetzung Sie skizziert. Ich kann die Klassen in späteren Iterationen zugunsten Ihres minimalistischen Ansatzes eliminieren.

+0

nur IPv4 oder IPv6 auch? – CodesInChaos

Antwort

1

Ich kam mit dem folgenden Beispiel.

Eine Methode zum Konvertieren von IP-Adressen zu Zahlen für diesen Zweck ist leicht zu finden, also habe ich den Link in die Methode aufgenommen, von der ich es abgeleitet habe.

Ich verwende Reguläre Ausdrücke, um zu testen, ob die Eingabedaten mit einem Muster übereinstimmen, fühlen Sie sich frei, wegzulassen oder zu ändern, wie Sie benötigen. (Zum Beispiel verwenden MAC-Adressen im Unix-Stil Doppelpunkte (:) statt Bindestriche (-).)

Um MAC-Adressen zu konvertieren, lasse ich nur das Trennzeichen weg und analysiere den gesamten String als langen int.

In meinem Beispiel zeige ich die Zahlen an, in die mehrere IP- und MAC-Adressen konvertiert werden, so dass Sie die oberen und unteren Grenzen definieren und verschiedene Kombinationen testen können.

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

Also, um den Einsatz dieser Methoden zu machen, führen Sie nur einige Vergleiche auf die konvertierten Werte:

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

Hier ist eine nette Klasse von Richard Szalay hier bei StackOverflow in einer anderen Frage.

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

Dies ist eine nette Klasse und ermöglicht es Ihnen, zu überprüfen wheter eine IP in einem bestimmten Bereich liegt.

Müssen Sie MAC und IP überprüfen?

+0

Dank alexn, jede Messung wird entweder ein MAC oder IP, also muss ich beide vergleichen. Wie ich bereits erwähnt habe, bin ich dabei, jedes Oktett im MAC in binäre umzuwandeln und dann einen Vergleich zu machen. – kingrichard2005