Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Проверка IP-адреса


Автор: pavel87 7.6.2007, 17:44
Здравствуйте
такой вопрос:
как проверить, принадлежит ли IP-адрес подсети
напр есть массив ('192.168.0.0/24','192.168.1.0/24','10.0.0.0/8')
и файл вида
Код

192.168.0.1
212.212.212.212
10.2.21.2
1.1.1.1
192.168.10.3
54.41.23.54

проверить и выдать результат: принадлежит ли Ip адрес к подестям, указанным в массиве

Автор: JAPH 7.6.2007, 19:10
Принадлежат ли ip-адреса из списка тем, что есть в файле, или наоборот? Куда выдать?

Автор: Nab 7.6.2007, 19:26
Я делал для системы учета трафика...

для начала там структура сетей у меня другая, список ('192.168.0.0/24','192.168.1.0/24','10.0.0.0/8') у меня приведен к виду
Код

$nets = { 
    24 => {
        '192.168.0.0' => 1
        '192.168.1.0' => 1
    },
    8 => {
        '10.0.0.0' => 1
    }
}


в качестве значения хеша у меня стоит номер идентифицирующий класс сети, потому как у меня их было аж четыре.. локальный траф мировой, и сети двух провайдеров.

И вот такая функция:

Код

sub in_net {
    my $ip = shift;
    my $pip = 0;
    # sort & reverse это чтобы при пересечении сетей,  совпадение произошло с самой длинной маской
    foreach (reverse(sort {$a <=> $b} (keys(%{$nets})))) {
        $pip = unpack("L", pack("B32", unpack("B$_", pack("CCCC", split(/\./,$ip)))));
        if (defined($nets->{$_}->{$pip})) { return $nets->{$_}->{$pip} }
    }
    return 0;
};

она возвращает класс сети к которой принадлежит IP.

Добавлено через 8 минут и 16 секунд
Ой, хеш немного не такой вид имеет, там тоже упакованные IP сетей smile
Код

# выборка из базы
# mask, net и  class_id - поля в базе
    while ($hash_ref = $sth->fetchrow_hashref) {
        # перепаковываем сеть как 4-х байтовое целое с наложением маски
        $packIP = unpack("L", pack("B32", unpack("B$hash_ref->{'mask'}", pack("CCCC", split(/\./,$hash_ref->{'net'})))));
        $self->{'mask'}->{$hash_ref->{'mask'}}->{$packIP} = $hash_ref->{'class_id'};
    }

Автор: ADm 9.6.2007, 08:23
а еще, есть готовый модуль Net::IP

Автор: arto 9.6.2007, 09:12
perldoc Net::Patricia

Автор: TwiSteR 26.6.2008, 13:17
Цитата(arto @  9.6.2007,  09:12 Найти цитируемый пост)
Net::Patricia 

То что надо smile  !!!

Автор: n4n0bit 26.6.2008, 15:59
Вот еще http://http://search.cpan.org/dist/Net-IP-Match-Regexp/lib/Net/IP/Match/Regexp.pm

и тут http://http://yandex.ru/yandsearch?text=%D0%BF%D1%80%D0%B8%D0%BD%D0%B0%D0%B4%D0%BB%D0%B5%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C+ip+%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%B0+%D0%BA+%D0%BF%D0%BE%D0%B4%D1%81%D0%B5%D1%82%D0%B8

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)