Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка персечения диапазона IP со списком, диапазонов 
:(
    Опции темы
GoDleSS
Дата 12.9.2008, 15:24 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток, уважаемые форумчане!

Попалась мне задачка одна, а красивых методов пока не придумал, может кто подскажет из собственного опыта:
Есть диапазон ip-адресов, заданный в виде 192.168.0.1 - 192.168.1.254.
Есть список таких же диапазонов.
Цель: проверить, пересекается ли введенный диапазон с любым диапазоном из списка.

Строить по всем диапазонам массивы - глупо.
Можно, конечно, перевести в число и проверять, т.е. что-то вроде:
Код

...
my ($start, $stop) = int_range($start_ip, $stop_ip);
my $error = 0;
foreach my $elem (@ranges_list) {
  ($elem->{start}, $elem->{stop}) = int_range($elem->{start}, $elem->{stop});
  if ( ($start >= $elem->{start} && $start <= $elem->{stop}) || 
       ($stop <= $elem->{stop}  && $stop  >= $elem->{start}) ) {
    $error = 1;
    last;
  }
}

...
sub int_range {
    my $start = shift || return(0);
    my $stop  = shift || return(0);

    my @start = split(/\./, $start);
    my @stop  = split(/\./, $stop);

    ($start, $stop) = (0, 0);
    for (my $i = 4; $i > 0; $i--) {
        $start += $start[4 - $i] * (256**($i - 1));
        $stop  += $stop[4 - $i] * (256**($i - 1));
    }

    return ($start, $stop);
}

Но хотелось бы нечто более красивое smile
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
AriX
Дата 12.9.2008, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Net::IP, Net::Patricia.

Это сообщение отредактировал(а) AriX - 12.9.2008, 17:20
PM MAIL   Вверх
GoDleSS
Дата 13.9.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Net::IP, Net::Patricia.

Хмм, мне казалось, что эти модули подходят про проверки вхождения единичного айпи-адреса в в диапазон. Но не диапазона в список диапазонов.
И еще один момент, мне не хотелось бы внедрять в систему дополнительные модули, стараемся сего избегать по возможности.
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
nitr
Дата 13.9.2008, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



GoDleSS, тогда попытайтесь поискать ответ на форуме, при мне такие случаи обсуждались, и там тоже без модуля делали.


--------------------
PM   Вверх
Bulat
Дата 15.9.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



GoDleSS, делал я нечто подобное(правда там не мало делалось на уровне БД, поэтому не думаю что конкретно мои решения в данном случае подойдут, но суть ... ), есть такая функция inet_aton(), по-моему везде под одним и тем же именем идет, преобразовывает из чисел и точек в единое число. На мой взгляд один из оптимальных способов для работы с IP-адресами. smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
DaemonSuw
Дата 15.9.2008, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Bulat, вы правы! GoDleSS, вот пример перевода

#!/usr/bin/perl

Код

print ip2int("111.12.32.12");

sub ip2int{
   my ($i)=@_;
   $i=~/(\d+)\.(\d+)\.(\d+)\.(\d+)/;
   return $1*256*256*256+$2*256*256+$3*256+$4;


PM MAIL ICQ   Вверх
GoDleSS
Дата 16.9.2008, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



DaemonSuw, если посмотрите, примерно также и решал задачу перевода, подход чуть другой просто.


Bulat, появились на почве первой задачи еще и дополнительные, там(ради разнообразия) решил как раз с помощью inet_aton/pack/unpack и обратный перевод unpack/inet_ntoa
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
gcc
Дата 16.9.2008, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



Код

Например, задача преобразования IP-адреса из формата xxx.xxx.xxx.xxx в int (для сохранения в БД).  Самый быстрый вариант

Код

my $ip_int = unpack("N", pack("C4", split(/\./, $ip)));

© ginnie

у вас список чтоли большой очень? разве ip в хэше оно много места занимает? или там много хостов за сутки будут проверять ip?

Это сообщение отредактировал(а) gcc - 16.9.2008, 08:10
PM WWW ICQ Skype GTalk Jabber   Вверх
GoDleSS
Дата 16.9.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

у вас список чтоли большой очень? разве ip в хэше оно много места занимает? или там много хостов за сутки будут проверять ip?

Объем порядочный - это задачка для биллинговой системе, заказ под конкретного клиента, а клиент - крупный московский оператор.
Просто произошла небольшая несостыковка схемы нашей биллинговой системы и пожеланий оператора, но клиент-то всегда прав =)

В целом с задачей разобрался, доведу когда до ума - отпишу. 
Цитата
unpack("N", pack("C4", split(/\./, $ip)));

На данный момент лучшее решение.

Это сообщение отредактировал(а) GoDleSS - 16.9.2008, 11:11
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
Bulat
Дата 16.9.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(GoDleSS @  16.9.2008,  11:05 Найти цитируемый пост)
Объем порядочный - это задачка для биллинговой системе

Хм, я тоже когда с биллингом возился, как раз столкнулся с подобного рода задачей, но решал сразу в базе, в MySQL есть одноименная функция. smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
GoDleSS
Дата 16.9.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Хм, я тоже когда с биллингом возился, как раз столкнулся с подобного рода задачей, но решал сразу в базе, в MySQL есть одноименная функция.

1. В базе не стоит по ряду причин(в моем случае)
2. Пользуем Оракл(хотя в нем как раз возможностей навалом)
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
DaemonSuw
Дата 16.9.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



GoDleSS, извиняюсь просмотрел, и в правду тоже самое)))
gcc, это круто)))
Код

print unpack("N", pack("C4", split(/\./, $ip)));
 


Это сообщение отредактировал(а) DaemonSuw - 16.9.2008, 20:41
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




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


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

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