Работа с MAC и IP-адресами в C # - PullRequest
1 голос
/ 23 ноября 2010

Я работаю над проектом, который требует умения работать с MAC и IP-адресами.В этом конкретном проекте у меня есть измерение и верхний и нижний пределы для сравнения, то есть измерение должно находиться в пределах верхнего / нижнего пределов.И измерение, и верхний / нижний пределы могут быть MAC-адресами, IP-адресами, шестнадцатеричным, двоичным и т. Д. Можно ли программно проверить, находится ли MAC / IP-адрес в определенном диапазоне?На данный момент, я предполагаю, что мне придется преобразовать MAC-адрес или IP-адрес в шестнадцатеричный или двоичный код и сравнить таким образом.Любые другие предложения приветствуются.

ОБНОВЛЕНИЕ: Используя информацию, предоставленную ссылкой, предоставленной alexn, я реализовал класс Ричарда Сзалая для проверки диапазонов IP-адресов ниже для всех, кому это необходимо.

/// <summary>
    /// Used for evaluating IPAddress ranges.  Class courtesy of Richard Szalay's solution on /1754961/kak-proverit-popadayt-li-vhodyaschie-ip-v-opredelennyi-diapazon-ip
    /// </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-адресов, реализуя методы, которые вы описали.Я могу исключить классы в пользу вашего минималистского подхода в последующих итерациях.

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Я придумал следующий пример.

Метод преобразования IP-адресов в числа для этой цели легко найти, поэтому я включил ссылку в метод, из которого я его получил.

Я использую регулярные выражения для проверки соответствия входных данных шаблону, не стесняйтесь опускать или изменять по мере необходимости. (Например, MAC-адреса в стиле Unix используют двоеточия (:) вместо дефисов (-).)

Чтобы преобразовать MAC-адреса, я просто опускаю разделитель и анализирую всю строку как long int.

В моем примере я показываю числа, в которые преобразуются несколько примеров 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 голос
/ 23 ноября 2010

Вот хороший класс, разработанный Ричардом Сзалайем здесь, в StackOverflow, в другом вопросе.

Как проверить, попадают ли входящие IP-адреса в определенный диапазон IP-адресов

Это удобный класс, позволяющий проверить, находится ли IP-адрес в указанном диапазоне.

Вам нужно проверить MAC и IP?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...