Толик Панков
hex_laden
............ .................. ................

October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Толик Панков [userpic]
C#, проверка попадания IP-адреса в зарезервированные диапазоны.

Про зарезервированные диапазоны и то, как проверить, попадает ли в них адрес IPv4, я уже писал и приводил решение данной задачи на PHP. Теперь вариант на C#.

Понадобится функция IPConverter.IPToInt32(IP), которую я описывал в прошлой заметке, аналог функции ip2long() PHP

В остальном все делается также, как и в PHP-примере.

1. Заводим двумерный массив, содержащий IP начала диапазона, конечный IP и описание диапазона:

string[,] SpecList = new string[,]  {
   {"0.0.0.0","0.255.255.255", "Current network"},
   {"255.255.255.255","255.255.255.255", "Broadcast"},
   {"255.0.0.0","255.255.255.255", "Reserved by the IETF, broadcast"},
   {"10.0.0.0","10.255.255.255", "Private network"},
   {"100.64.0.0","100.127.255.255", "Shared Address Space"},
   {"127.0.0.0","127.255.255.255", "Loopback"},
   {"169.254.0.0","169.254.255.255", "Link-local"},
   {"172.16.0.0","172.31.255.255", "Private network"},
   {"192.0.0.0","192.0.0.7", "DS-Lite"},
   {"192.0.0.170","192.0.0.170", "NAT64"},
   {"192.0.0.171","192.0.0.171", "DNS64"},
   {"192.0.2.0","192.0.2.255", "Documentation example"},
   {"192.0.0.0","192.0.0.255", "Reserved by the IETF"},
   {"192.88.99.1","192.88.99.1", "IPv6 to IPv4 Incapsulation"},
   {"192.88.99.0","192.88.99.255", "Anycast"},
   {"192.168.0.0","192.168.255.255", "Private network"},
   {"198.51.100.0","198.51.100.255", "Documentation example"},
   {"198.18.0.0","198.19.255.255", "Test IP"},
   {"203.0.113.0","203.0.113.255", "Documentation example"},
   {"224.0.0.0","224.255.255.255", "Multicast"},
   {"240.0.0.0","240.255.255.255", "Future reserved"}
};


2. Пишем функцию, которая перебирает массив, и проверяет, попал ли указанный IP в один из диапазонов. Если попал - возвращает описание диапазона, если нет - пустую строку. IP-адреса конвертируются функцией IPConverter.IPToInt32(IP) в целые числа и сравниваются:

string CheckSpecDiaps(string IP)
{
    int uip = IPConverter.IPToInt32(IP);

    for (int i = 0; i < SpecList.GetLength(0); i++)
    {
        int start = IPConverter.IPToInt32(SpecList[i, 0]);
        int end = IPConverter.IPToInt32(SpecList[i, 1]);
        string desr = SpecList[i, 2];

        if (uip >= start && uip <= end)
        {
            return desr;
        }
    }

    return string.Empty;
}


Пример на GitHub

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2018/09/02/c-proverka-popadaniya-ip-adresa-v-zarezervirovannye-diapazony/

Comments

Заводим счетчик и проходимся по всем элементам на следующем уровне после нулевого (первого) измерения массива. Массив заранее определен, измерения 2 (первое aka нулевое эмулирует вложенный массив, 2 aka 1 - хранит данные). Что не так?