Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод имен ПК по IP-адресам 
V
    Опции темы
worsvch
  Дата 23.4.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Perl стал изучать неделю назад, так что не могу понять в чем проблема, где ошибка. Perl установлен в WindowsXP
Нужно вывести имена всех ПК в файл

#!/perl

use Socket;

open(PKNAME,'> pknames') or die ("Can't create file");

for ($x = 2;$x <= 253;$x++) {
@addr = gethostbyaddr((inet_aton("192.168.1.".$x)),AF_INET);
print PKNAME "Name of 192.168.1.".$x." is ".@addr[$x]."\n"; 
}

close(PKNAME);


Вывод получается такой:
"Name of 192.168.1.2 is "
"Name of 192.168.1.3 is "

А должен быть примерно такой:
"Name of 192.168.1.2 is ИМЯ_КОМПЬЮТЕРА"
"Name of 192.168.1.3 is ИМЯ_КОМПЬЮТЕРА"

и так далее. Пробовал сделать без цикла с одним ПК, там получилось. А вот на целую сеть не получается. :wall:
К тому же скрипт достаточно долго обрабатывает все адреса, нельзя как то ускорить его работу? smile
PM MAIL   Вверх
ginnie
Дата 23.4.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



worsvch, можно попробовать

for ($x = 2;$x <= 253;$x++) {
    my $addr = gethostbyaddr((inet_aton("192.168.1.".$x)),AF_INET);
    print PKNAME "Name of 192.168.1.$x is $addr\n"; 
}

Это сообщение отредактировал(а) ginnie - 23.4.2009, 17:28


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
shamber
Дата 24.4.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Название компа храниться в $addr[0] Это ваша ошибка.
используйте Data::Dumper или отладчики которые позволяют просматривать содержимое переменных

А быстрее скорее всего никак, тут все упирается в скорость ответа вашего dns  сервера.
При этом дольше всего ожидать ответ если компа нет в сети(на моей машине ответ о существующих 0.7 c  ответ об отсутсвующих 14.7c)
К сожалению под Windows нельзя поставить timeout для Socket. по крайней мере я не нашел.....

можно попробовать:

распараллелить smile
использовать Net::DNS
правда у меня он отказался работать по нормальному.Но это проблемы моего DNS.

Это сообщение отредактировал(а) shamber - 24.4.2009, 14:21
PM MAIL Jabber   Вверх
shamber
Дата 24.4.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Попробуйте такой код
Код

use strict;
use Time::HiRes qw(gettimeofday tv_interval);
use Net::DNS;
         my $res = Net::DNS::Resolver->new(
               udp_timeout => 2,
               retry       => 1,
              #debug       => 1,
          );
open(PKNAME,'> pknames') or die ("Can't create file");
my $t0 = [gettimeofday];
my $x;
for ($x = 1;$x <= 253;$x++) {
    my $t1 = [gettimeofday];
my $host = '10.2.4.';
$host .=$x;
if (my $pkt = $res->query($host)) {
    for my $answer ( $pkt->answer() ) {
        my $type = $answer->type();
        if ($type eq "PTR"){
            print PKNAME "Name of 10.2.4.".$x." is ".$answer->ptrdname()."\n";
        } elsif ($type eq "A") {
            print  PKNAME "Name of 10.2.4.".$x." is ".answer->name()."\n";
            }
    }
}
my $elapsed = tv_interval ($t1);
print $elapsed."\n";
}
close(PKNAME);


Это сообщение отредактировал(а) shamber - 25.4.2009, 01:59
PM MAIL Jabber   Вверх
arto
Дата 25.4.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perl -MSocket -le 'foreach (@ARGV) { my $a = (gethostbyaddr (inet_aton ($_),AF_INET))[0] or next; print "$_: $a" }' 192.168.1.{1..255}
PM MAIL ICQ   Вверх
amg
Дата 27.4.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



arto, человек же сказал, что у него винда. Зачем предлагать команду, которую он почти наверняка не сможет исполнить? (cmd не понимает одинарных кавычек и масок он понимает даже самых простых, а таких как 192.168.1.{1..255} -- тем более. А если предположить, что юзер настолько продвинут, что поставил себе нормальный шелл, то он, скорее всего, и на заданный им вопрос сам легко нашел бы ответ.)
PM MAIL   Вверх
worsvch
Дата 27.4.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Цитата(amg @ 27.4.2009,  12:28)
arto, человек же сказал, что у него винда. Зачем предлагать команду, которую он почти наверняка не сможет исполнить? (cmd не понимает одинарных кавычек и масок он понимает даже самых простых, а таких как 192.168.1.{1..255} -- тем более. А если предположить, что юзер настолько продвинут, что поставил себе нормальный шелл, то он, скорее всего, и на заданный им вопрос сам легко нашел бы ответ.)

Во-первых, то что я только начал изучать perl совсем не означает, что я простой юзер. Я всего лишь начал изучать perl. Да и зачем юзеру изучать языки программирования?  smile 
Во вторых, если Вы намекали на то, что лучше это все было делать, к примеру, в линуксе, так это я и сам знаю, и  даже знаю как выполнить эту команду в линуксовой консоли. Но на работе линукс ставить никто не разрешит, а так бы поставил.  smile 
А в-третьих я уже и сам со скриптом разобрался. Я просто не знал, что имя машины записывается в @addr[0], а не в @addr[$x].
Да и pod, которые находятся в pm-файлах я уже научился пользоваться, так что по большей части пытаюсь сам разбираться  smile 
Вот так вот  smile 
PM MAIL   Вверх
shamber
Дата 28.4.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Цитата(worsvch @  27.4.2009,  16:44 Найти цитируемый пост)
Я просто не знал, что имя машины записывается в @addr[0], а не в @addr[$x].

Так я тоже не знал smile смотреть надо smile
PM MAIL Jabber   Вверх
worsvch
Дата 28.4.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Цитата(shamber @ 28.4.2009,  12:28)
Цитата(worsvch @  27.4.2009,  16:44 Найти цитируемый пост)
Я просто не знал, что имя машины записывается в @addr[0], а не в @addr[$x].

Так я тоже не знал smile смотреть надо smile

А где смотрели, если не секрет?  smile 
PM MAIL   Вверх
arto
Дата 28.4.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc -f gethostbyaddr
perldoc Data::Dumper
PM MAIL ICQ   Вверх
worsvch
  Дата 28.4.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Цитата(arto @ 28.4.2009,  13:41)
perldoc -f gethostbyaddr
perldoc Data::Dumper

Arto, спасибо, я этого не знал. Посмотрел. Что-то типа man только для perl  smile

Добавлено через 1 минуту и 46 секунд
Всем ответившим спасибо. С проблемой разобрался. Всё заработало  smile 
PM MAIL   Вверх
shamber
Дата 28.4.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Цитата(worsvch @  28.4.2009,  13:26 Найти цитируемый пост)
А где смотрели, если не секрет?  smile  


Цитата(shamber @  24.4.2009,  11:45 Найти цитируемый пост)
используйте Data::Dumper или отладчики которые позволяют просматривать содержимое переменных

PM MAIL Jabber   Вверх
shamber
Дата 28.4.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Галочки не забывайте ставить если вопрос решен smile
PM MAIL Jabber   Вверх
worsvch
  Дата 28.4.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Поставил галочку  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.