Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить, входит ли IP в заданный диапазон? 
V
    Опции темы
Alca
Дата 27.1.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Есть список IP адресoв (http://iplists.com/nw/google.txt). 
Как определить, входит ли данный IP в заданный диапазон?

Добавлено @ 12:44
Код

// диапазоны
const size_t cuiBlackList[][2] = {
  /* { IP, Mask } */
  {3518589952U,4294967040U},{3518627072U,4294967040U},
  {3512069632U,4294967040U},{3512069643U,4294967295U}
};


Это сообщение отредактировал(а) Alca - 27.1.2011, 12:47


--------------------
PM WWW ICQ Skype Jabber   Вверх
phprus
Дата 27.1.2011, 15:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



IP & Netmask == NetIP
Если это условие выполняется, значит IP входит в подсеть NetIP.

Netmask - маска подсети (если задана в формате /N, то Netmask = ((~0U) << (32-N)) )
NetIP - IP адрес сети.
PM MAIL WWW ICQ   Вверх
Alca
Дата 27.1.2011, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Спасибо. Вот нашел кое-что, там PHP. но все тоже самое.
http://xpoint.ru/forums/programming/perl/m...ead/32675.xhtml

Код

# инициализация
# проверяемый IP в целочисленном представлении
my $ip = 718768768;
# массив адресов сетей провайдеров (всего N), отсортированных по адресу сети
my @providers = (
    # Net1, Mask1
    [ 3703570432, 4293918720 ],
    # Net2, Mask2
    [ 3703570432, 4293918720 ],
    ...
    # NetN, MaskN
    [ 3703570432, 4293918720 ],

);
# двоичный поиск (очень грубо, точные алгоритмы можете без труда найти в Сети или в этом форуме)
my $start = 0;
my $end = @providers - 1;
# позиционируемся в середину массива
my $pos = @providers >> 1; # все равно что поделить нацело на 2
while ($pos > 0)
{
    # проверяемый провайдер
    my $p = $providers[$pos];
    my $net = $p->[0];
    my $mask = $p->[1];
    # проверка на вхождение
    if ( ($ip & $mask) == $net )
    {
        # нашли. выходим.
        return 1;
    }
    # IP находится в сетях с меньшим адресом
    elsif ($ip < $net)
    {
        $end = $pos;
    }
    # IP находится в сетях с большим адресом, будем искать
    else
    {
        $start = $pos;
    }
    # позиционируемся в середину больших или меньших адресов
    $pos = ($end - $start) >> 1;
}


Добавлено через 5 минут и 33 секунды
Как с данного списка:
http://iplists.com/nw/google.txt
получить массив:
Код

// диапазоны
const size_t cuiBlackList[][2] = {
  /* { IP, Mask } */
  {3518589952U,4294967040U},{3518627072U,4294967040U},
  {3512069632U,4294967040U},{3512069643U,4294967295U}
}
 ???


--------------------
PM WWW ICQ Skype Jabber   Вверх
phprus
Дата 27.1.2011, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Там, где два старших байта - маска /16, там где 3 старших байта - маска /24, там, где указаны все 4 байта - маска /32.

Там, где указаны все 4 байта можно попробовать объединять в подсети, ища такие комбинации групп адресов из списка, в которых в адресе сети будет меньше значащих бит. Правда мне кажется, что такая задача будет относиться к NP сложности, а с учетом того, что в списке очень мало адресов лучше прямым перебором такие искать (добавив эти адреса в список с маской FFFFFFFF).
PM MAIL WWW ICQ   Вверх
Alca
Дата 27.1.2011, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Код

<?php

function net_match($network, $ip) {
      // determines if a network in the form of 192.168.17.1/16 or
      // 127.0.0.1/255.255.255.255 or 10.0.0.1 matches a given ip
      $ip_arr = explode('/', $network);
      $network_long = ip2long($ip_arr[0]);

      $x = ip2long($ip_arr[1]);
      $mask =  long2ip($x) == $ip_arr[1] ? $x : 0xffffffff << (32 - $ip_arr[1]);
      $ip_long = ip2long($ip);

      // echo ">".$ip_arr[1]."> ".decbin($mask)."\n";
      return ($ip_long & $mask) == ($network_long & $mask);
}

echo net_match('192.168.17.1/16', '192.168.15.1')."\n"; // returns true
echo net_match('127.0.0.1/255.255.255.255', '127.0.0.2')."\n"; // returns false
echo net_match('10.0.0.1', '10.0.0.1')."\n"; // returns true

?>


Это сообщение отредактировал(а) Alca - 27.1.2011, 18:06


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.