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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как пропинговать хост, Небольшая неувязочка при пинге 
:(
    Опции темы
StealtH
Дата 23.9.2004, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот такой вопросик, есть код:

Код
if(&ping($host)){
print "Yes\n";
}else{
    print "No\n";}


sub ping($host)
{
use Net::Ping;
   $p=Net::Ping->new();
   $p->hires();
   ($ret, $duration, $ip) = $p->ping($host, 5.5);
    if($ret)
    {
      for ($i=0;$i<=$num_times;$i++)
      {
        $p->hires();
        ($ret, $duration, $ip) = $p->ping($host, 5.5);
        $ping_time+=$duration;
      }
      $ping_time=$ping_time/$i;
      $p->close();
      return 1;
    }else {
      $p->close();
      return 0;
}


так вот при $host='реально существующий хост' функция возвращает 0, в обратном случае тоже самое.
И второй вопрос:
при ответе пингуемого хоста время пинга $ping_time имеет очень жуткие значения, т.е. в 3-5 раз больше чем при пинге системной командой.

Помогите плиз, люди добрые, может где-то ошибочка или недоглядел чего.

Это сообщение отредактировал(а) StealtH - 23.9.2004, 22:25
PM MAIL   Вверх
korob2001
Дата 27.9.2004, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата

так вот при $host='реально существующий хост' функция возвращает 0, в обратном случае тоже самое.

Попробуй такой вариант:
Код

#!/usr/bin/perl
my $host = "81.82.117.10";
my $num_times = 5;
if ( &pingNet( $host ) ){
    print "Yes\n";
} else {
    print "No\n";
}


sub pingNet {
   my $host = shift;
   use Net::Ping;
   my $p = Net::Ping->new();
      $p->hires();
   my( $ret, $duration, $ip ) = $p->ping( $host, 5.5 );
   if( $ret ) {
       for ( $i=0; $i<=$num_times; $i++) {
             $p->hires();
             ( $ret, $duration, $ip ) = $p->ping( $host, 5.5 );
             $ping_time += $duration;
       }
     $ping_time = $ping_time / $i;
     print "Ping time: $ping_time\n";
     print "-" x 80, "\n";
     $p->close();
     return 1;
   } else {
     $p->close();
     return 0;
   }
}

Обрати внимание на то, что в Perl в подпрограмме, в круглых скобках можно указать прототип. Тогда строка в которой создаётся подпрограмма, в нашем случает это pingNet, можно записать таким образом:
Код

sub pingNet($) {
      # Тело подпрограммы
}

Заметь что нельзя указывать в круглых скобках переменную которая получает параметр переданный подпрограмме, в нашем случае это переменная $host. В круглых скобках можно указать только прототип.
В противном случае, круглые скобки вообще не нужно указывать.

Все параметры которые ты передаёшь в подпрограмму можно получить в теле самой подпрограммы, обратившись к массиву @_.

Цитата

И второй вопрос:
при ответе пингуемого хоста время пинга $ping_time имеет очень жуткие значения, т.е. в 3-5 раз больше чем при пинге системной командой.

Системная комманда будет работать быстрее, так как много времени уходит на запуск внешнего интерпитатора, подключения модулей, компиляцию в промежуточный байт код и т.д.

Удачи.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
StealtH
Дата 28.9.2004, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, попробую smile.gif

Цитата
Системная комманда будет работать быстрее, так как много времени уходит на запуск внешнего интерпитатора, подключения модулей, компиляцию в промежуточный байт код и т.д.


А как в таком случае приблизить данные к реальным, т.е. как вычислить время за которое компилится программа и соответственно из полученного пингтайма вычесть это время


PM MAIL   Вверх
korob2001
Дата 28.9.2004, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата

А как в таком случае приблизить данные к реальным, т.е. как вычислить время за которое компилится программа и соответственно из полученного пингтайма вычесть это время

Попробуй модуль Benchmark или функцию times().

Если хочешь добиться максимальной быстроты, то просто скомпиль файл в .exe . Эксешник работает быстрее, но постарайся перед компиляцией максимально оптимизировать код, подключай по возможности как можно меньше модулей. Потому как, при компиляции Perl файла, в него компилица не только твоя програ с расширением .pl, но и сам инетрпритатор, а так же все подключаемые модули. От того файл .exe быстро набирает вес, что не есть гуд.
Желательно компилить большие проекты, почему объснять не буду, так как выше уже изложил, что происходит при компиляции.
Короче не стоит создавать .exe из проги "Hello, world!", так как к двум строкам кода:
Код

#!/usr/bin/perl
print "Hello, world!";

Добавится вес интерпритатора, естественно не всего, а только необходимых его частей. Это делается для того, что бы такой эксешник можно было запускать на машине, на которой не установлен интерпритатор Perl.

Удачи.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
StealtH
Дата 28.9.2004, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(korob2001 @ 28.9.2004, 23:14)
Если хочешь добиться максимальной быстроты, то просто скомпиль файл в .exe . Эксешник работает быстрее

Так в том-то все и дело, что прога работает под линухом, в экзешник его не запихнешь.

У меня по этому поводу вознила идея: а не лучше ли будет пинговать системной командой, и вывод с нее перехватывать перловой прогой. Если есть вариант подскажи как, или подкинь ссылку на "человеческую" литературу, как это все проще сделать.
PM MAIL   Вверх
korob2001
Дата 29.9.2004, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Для вызова системной команды, юзай system(), но учти, что она просто выполнит системную команду но сохранить в переменной результат её выполнения, для дальнейшей обработки, у тебя не получится:
Код

#!/usr/bin/perl
use strict;
system( ls );


Если команда что-то возвращает и у тебя есть желание сохранить это в переменную или массив, тогда обратные кавычки, то что нужно.

Пример:
Код

#!/usr/bin/perl
use strict;
my @dir = `ls`; # Кавычки обратные
foreach ( @dir ) {
   print $_, "\n";
}

По возможности старайся юзать system(), так как она более безопасна.

Удачи.

Это сообщение отредактировал(а) korob2001 - 29.9.2004, 00:06


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
StealtH
Дата 30.9.2004, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Громадное спасибо, эти куски кода помогли сразу решить траблу не только с пингом, но и с многим другим, как только доделаю прогру обязательно поделюсь smile.gif

Начал юзать вспомнил еще один ньюанс: как запустить несколько процессов из скрипта, не дожидаясь пока процесс что-то возвратит thumbs-up.gif

Это сообщение отредактировал(а) StealtH - 30.9.2004, 02:15
PM MAIL   Вверх
korob2001
Дата 30.9.2004, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Посмотри доки по хешу %SIG. Помоему с его помощью управляют процессами. Ещё тебе может понадобиться функция fork().
perldoc -f fork


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


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

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


 




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


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

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