URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 55277
[ Назад ]

Исходное сообщение
"Широковещательный запрос и поимка ответа (perl sockets udp)"

Отправлено yumm , 07-Апр-05 15:21 
Задача: в сети живет сервер (возможно, что и не один), о котором известно, что если он поймает на определенный порт широковещательный запрос, то обязательно ответит отправителю. Нужно послать такой запрос и получить список всех ответивших серверов. Желательна реализация на Perl'e.

Вот такой кусок кода:
<---
$sock = IO::Socket::INET->new(Proto     => 'udp',
                              Broadcast => 1,
                              LocalPort => $srcport,
                              PeerPort  => $dstport,
                              PeerAddr  => inet_ntoa(INADDR_BROADCAST)
                              ) or die "sender socket: $@\n";
$sock->send($msg) or die "send: $!";
--->
шлет broadcast запрос. В сниффере (ethereal) я вижу приходящий ответ... Но вот поймать его никак не получается... И сразу встает вопрос: если этих ответов будет несколько, что делать? Спасибо.


Содержание

Сообщения в этом обсуждении
"Широковещательный запрос и поимка ответа (perl sockets udp)"
Отправлено gr , 07-Апр-05 15:34 
>Задача: в сети живет сервер (возможно, что и не один), о котором
>известно, что если он поймает на определенный порт широковещательный запрос, то
>обязательно ответит отправителю. Нужно послать такой запрос и получить список всех
>ответивших серверов. Желательна реализация на Perl'e.
>
>Вот такой кусок кода:
><---
>$sock = IO::Socket::INET->new(Proto     => 'udp',
>                              Broadcast => 1,
>                              LocalPort => $srcport,
>                              PeerPort  => $dstport,
>                              PeerAddr  => inet_ntoa(INADDR_BROADCAST)
>            
>          
>       ) or die "sender
>socket: $@\n";
>$sock->send($msg) or die "send: $!";
>--->
>шлет broadcast запрос. В сниффере (ethereal) я вижу приходящий ответ... Но вот
>поймать его никак не получается... И сразу встает вопрос: если этих
>ответов будет несколько, что делать? Спасибо.


в perl cookbook есть пример сервера udp


"Широковещательный запрос и поимка ответа (perl sockets udp)"
Отправлено yumm , 07-Апр-05 15:42 
>в perl cookbook есть пример сервера udp

ну хорошо (про пример я есс-но знаю)... пишу я дальше следующее:
<---
$sock->close();

$sock = IO::Socket::INET->new(LocalPort => $srcport, Proto => 'udp')
  or die "socket: $@";

while ($sock->recv($msg, $maxlen)) {
    my ($port, $ipaddr) = sockaddr_in($sock->peername);
    my $ip = inet_ntoa($ipaddr);
    print "$ip\n";
}
--->
...и ничего не принимаю... хотя в сниффере пакетов только летают. почему?


"Широковещательный запрос и поимка ответа (perl sockets udp)"
Отправлено yumm , 08-Апр-05 10:58 
Переформулирую вопрос. Мне нужно очень примитивную вещь реальзовать (все равно на чем на самом деле, но лучше на c или perl), создать сервер слушающий по порту NNNN, послать broadcast сообщение, принять все ответы и определить кто-же (ip) ответил. Все. Неужели никто не делал?