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


Автор: eXeC001er 10.6.2011, 16:34
Имеем UDP сокет, который висит на всех интерфейсах. Необходимо определить с какого интерфейса пришел DHCP запрос.
попробовал как описано ниже, но $ipaddr1 и $ipaddr2 остаются пустыми. IP адрес клиента понятное дело пуст, т.к. клиент первоначально не имееет IP, почему пусто в адресе сокета и как его всеже получить?
Код

#!/usr/bin/perl -w

use IO::Socket::INET;

my $sock = IO::Socket::INET->new(LocalPort => 67, Broadcast =>1, Proto => 'udp') or die "Cannot create socket: $!\n";

my $newmsg = ""; 
my $max_len = 1024;
while($sock->recv($newmsg, $max_len)) {
    if($newmsg) {
        my($port1, $ipaddr1) = sockaddr_in($sock->peername);
        my($port2, $ipaddr2) = sockaddr_in($sock->sockname);
        print "Client $ipaddr1:$port1 on NIC $ipaddr2:$port2\n";                                                                 
    }   
}



Автор: Pfailed 10.6.2011, 19:35
В Linux есть опция сокета IP_PKTINFO. Похоже по описанию на то. Но в Perl эта опция и возвращаемая ей структура не поддерживаются, насколько я понял. Нужно будет делать XS обёртку.

Автор: arto 13.6.2011, 08:37
можно попробовать Net::Pcap или Net::RawIP

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