как получить групповой адрес с помощью getaddrinfo

Перекрестная публикация на: http://www.perlmonks.org/?node_id=988678

Я новичок в перле. Я пытаюсь получить все интерфейсы с подстановочными знаками, используя getaddrinfo (я использую Socket6 (IO:Socket:IP почему-то не работает на моем компьютере с Windows)), например:

use Socket;
use Socket6;

@res = getaddrinfo('<wildcard>', 3786, AF_UNSPEC, SOCK_STREAM);

while(scalar(@res)>=5){

    ($family, $socktype, $proto, $saddr, $canonname, @res) = @res;
    ($host, $port) = getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV);
    print ("\nhost= $host port = $port");
}

Мне интересно, какое значение я должен использовать для заполнителя, чтобы в результате я получил подстановочные адреса IPv4 и IPv6 (0.0.0.0 и ::), чтобы я мог привязываться к нему независимо от машины, которую я использую (IPv4 или IPv6). В 'c' указание нулевого указателя имени хоста делает свою работу, для perl я пробовал '', undef, но они возвращают петлевые адреса.


person Sushant    schedule 21.08.2012    source источник


Ответы (1)


person    schedule
comment
используйте IO::Socket::IP -register; мой $sock = IO::Socket-›new(Domain => PF_INET6, LocalHost => ::1, Listen => 1, ) или die Невозможно создать сокет — $@\n; print Создал сокет типа . ссылка ($ носок) . \n; С приведенным выше кодом я получаю следующий вывод: c:\Perl\bin›perl c:\iosockip.pl Невозможно создать сокет - нет адреса, связанного с именем узла - person Sushant; 21.08.2012
comment
Во-первых, я предложил билет RT, а не здесь. Во-вторых: LocalHost =› ::1 сделает именно это, привяжите его к локальному хосту, предполагая, что он есть. Это не адрес подстановочного знака, который можно получить с помощью LocalHost =› ::, который в любом случае используется по умолчанию. Кроме того, вы не указали порт. - person LeoNerd; 21.08.2012
comment
Спасибо за ответ, сделаю с билетом RT. Просто небольшая предыстория, которую я пропустил в своем последнем комментарии. Я использую perl 5.14.2 (ActiveState), затем установил на нем Socket, Socket::GetAddrInfo , IO::Socket::IP с помощью ppm и только что попробовал пример программы, упомянутой здесь: search.cpan.org/~pevans/IO-Socket-IP-0.17/ lib/IO/Socket/IP.pm (упоминается в последнем комментарии); Будучи новичком в Perl, я не уверен, что мне не хватает - person Sushant; 21.08.2012
comment
@res = getaddrinfo('', 3786, AF_UNSPEC, SOCK_STREAM,0, AI_PASSIVE); вместо просто getaddrinfo('‹wildcard›', 3786, AF_UNSPEC, SOCK_STREAM); (в вопросе) решил мою проблему с Socket6, большое спасибо - person Sushant; 21.08.2012
comment
Кстати, вы, вероятно, захотите перейти с Socket6 на простой Socket, потому что getaddrinfo() в Socket теперь является ядром. - person LeoNerd; 21.08.2012
comment
Да, лучше использовать ядро, но, к сожалению, getaddrinfo() у меня не работал (может быть, что-то плохое, я пытаюсь разобраться) на моем виндовс-боксе, хотя на линуксе он работает отлично. Я создал rt.cpan.org/Public/Bug/Display.html ?id=79110 для того же, я был бы очень рад использовать IO::Socket::IP единообразно. - person Sushant; 21.08.2012