Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > соответствие внешнего IP localhost'у


Автор: BitCat 16.6.2006, 14:55
Господа, ситуация:

нужно определить, соответствует ли внешний IP (н-р, 217.216.214.213) localhost'у, т.е. 127.0.0.1.
проблема решается легко с помощью определения всех сетевых интерфейсов в системе и всех соответствующих для каждого интерфейса IP адресов. но вот с последним проблемы...

в системе присутствует N-ное кол-во сетевых интерфейсов:

# ifconfig:
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=b<RXCSUM,TXCSUM,VLAN_MTU>
        inet 192.168.6.82 netmask 0xfffffff8 broadcast 192.168.6.87
        inet6 fe80::20e:cff:fe4a:53f2%em0 prefixlen 64 scopeid 0x1
        inet 217.216.214.213 netmask 0xffffffff broadcast 217.216.214.213
        ether 00:0e:0c:4a:53:f2
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
em1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
        options=b<RXCSUM,TXCSUM,VLAN_MTU>
        ether 00:0e:0c:4a:53:f1
        media: Ethernet autoselect
        status: no carrier
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
...................
для каждого интерфейса нужно определить ВСЕ соответствующие ему IP адреса, т.е. для em0 - 
217.216.214.213, 192.168.6.82, 192.168.6.87.
Адреса 192.168.6.82, 192.168.6.87 (выделены синим) - определяются без проблем с помощью модуля IO::Interface, но вот 217.216.214.213 (а ведь может еще с десяток адресов быть для этого интерфейса) - непонятно как вытащить.
Само собой, использовать вызов системных утилит нельзя. Нужно решить проблему на уровне исходного текста.

Если у кого есть какие идеи - интересно послушать... 

Автор: sharq 22.6.2006, 00:50
BitCat

Код

use strict;
use Data::Dumper;

# разбор ifconfig на ключ => значение
my $temp;
my $hash = {};
while (<DATA>) {
    if (/^(\w\w\d+): (.*)$/) { # название интерфейса может быть только в начале и состоять из 2х букв и 1 цифры (точно?)
        $temp = $1;
        $hash->{$1} = $2;
    } else {
        $hash->{$temp||'.'} .= $_; # в точке содрежится "мусор"
    }
}

# выделение ip адресов
my $find;
while (my ($k, $v) = each %$hash) {
    next if $k eq '.';
    push @{$find->{$k}}, $v =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/g;
}
print Dumper $find;

__END__
# ifconfig:
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=b<RXCSUM,TXCSUM,VLAN_MTU>
        inet 192.168.6.82 netmask 0xfffffff8 broadcast 192.168.6.87
        inet6 fe80::20e:cff:fe4a:53f2%em0 prefixlen 64 scopeid 0x1
        inet 217.216.214.213 netmask 0xffffffff broadcast 217.216.214.213
        ether 00:0e:0c:4a:53:f2
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
em1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
        options=b<RXCSUM,TXCSUM,VLAN_MTU>
        ether 00:0e:0c:4a:53:f1
        media: Ethernet autoselect
        status: no carrier
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3


 smile   

Автор: BitCat 22.6.2006, 08:44
sharq, спасибо, но вызов (и парсинг) ifconfig - крайний вариант. 

Автор: sharq 22.6.2006, 10:52
BitCat
Цитата(BitCat @  16.6.2006,  15:55 Найти цитируемый пост)
Нужно решить проблему на уровне исходного текста.

ну, а я что сделал? 

Автор: BitCat 22.6.2006, 12:26
sorry. "на уровне исходного текста" имелось в виду не вызов ifconfig и парсинг его ответа, а решить это с помощью системных ф-ий (типа ioctl с каким-нибудь хитрым параметром), к-рая возвращает спиок всех алиасов сетевого интерфейса. а то ф-ии IO::Interface возвращают только внутренний локальный IP и широковещательный - и все. а если сетевому интерфейсу сопоставлены алиасы, то хз как их выцепить. 

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