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


Автор: wolter 26.1.2009, 16:13
Хотелось бы написать небольшую программуленьку (допустим в консольном ворианте) которая проверяла ла бы скорость интернета 
скорость загрузки файла и выгрузки
приверно так как это сделанно на http://2ip.ru
собственно кроме того как сделать проверку пинга в модулях по моей теме ничего не нашел, подскажите куда рыть)

Автор: tolkien 27.1.2009, 03:01
Это легко. Скорость находится по формуле
$v = $count / $t; #скорость байт/c 
$count - кол. полученных байт
$t - время за которое получены $count.

Автор: wolter 27.1.2009, 10:11
ну а както в примере это можно увидеть. а то я чтото не очень понял эту формулу, точнее вообще не понял smile 
я имею введу именно как в перл это реализовать чтобы что то на что то поделить это надо сначало получить вопрос как...

Автор: gcc 27.1.2009, 10:23
я видел скрипт который пишет сколько времени осталось до конца загрузки и скорость, перл + аякс...

то есть тогда когда файл начинает закачиватся оставить таймер, конгда закончит, то определить время сколько пршло...

Добавлено @ 10:26

www.perlmonks.org/?node_id=588964
    
Web Browser File Upload Progress Bar in Perl w/AJAX 

Автор: wolter 27.1.2009, 11:14
gcc, спасибо, но, это тоже немного не то, вот допустим есть модуль Net::Ping с помошью него можно сделать обычный пинг, это мне подходит потому как это работает в консоли и все на ура, но вот как допустим просто проверить скорость интернета, в сети полно ресурсов где это можно сделать вопрос в том как они это сделали и как это сделать в консоли на перле

Автор: wolter 27.1.2009, 13:05
и тишина....

Автор: shamber 27.1.2009, 15:39
wolter, вы как всегда очень спешите smile в консоле это делается также как и в другом месте. 
для проверки скорости upload и download вам нужно:
1 найти место откуда вы будете файл скачивать
2 найти место куда вы будете файл закакчивать
Если у вас есть свой хостинг то эти два вопроса решаются очень просто smile

А дальше все очень просто
для определения скрости скачивания, вы из скрипта начинаете скачивать файл. и в этот момент запускаете таймер.
через некоторое время(или по оканчании) скачивания вы просто считает скорость по предложенной вам tolkien  формуле.


Автор: wolter 27.1.2009, 15:46
shamber, а Вы все как всегда расстовляете на свои места, кстати спасибо вам за это, да хостинг свой есть, вориант который предложил  tolkien, я если честно не понял, мнебы хоть какойто пример, smile , потому как я так и не понял где прать сами данные которые потом делитьнадо друг на друга, кстати заодно интиресно узнать как указанный мой ресурс в пермом посте определяет среднию скорость интернета

Автор: shamber 27.1.2009, 22:48
wolter, простой пример для определения скорости download
Код

#!/usr/bin/perl -w
use strict;
my $url = 'xxx';# здесь указываете ссылку что скачивать, желательно чтобы файлик был около 1 мб(для чистоты эксперимента :) )
    use Time::HiRes qw/gettimeofday tv_interval/;
  use LWP::UserAgent;
 
 my $ua = LWP::UserAgent->new;
 $ua->timeout(10);
my $sizerequest = $ua->head( $url );#делаем запрос размера файла
my $size = $sizerequest->header('content_length'); #получаем размер в байтах
my $bytes = '102400';#используем для подсчета скорости
   my $t0 = [gettimeofday];
   my $t1 = [gettimeofday];

   my $response = $ua->get($url,':content_cb' => \&callback,':read_size_hint' => $bytes); #указываем что будем вызывать функцию callback каждые $bytes байт
 if ($response->is_success) {
     my $elapsed = tv_interval ( $t0 );
     my $speed = $size/$elapsed;# считаем среднюю скорость
print $speed."\n";
 }
 else {
     die $response->status_line;
 }

sub callback{
    #функция вызывается каждыq раз когда скачано $bytes
    my $elapsed = tv_interval ( $t1 ); 
    my $speed = $bytes/$elapsed;
    print $speed."b/sec\n";
    $t1 = [gettimeofday];
}

только не запутайтесь с размерностью.

А после того, как скачали файл, его точно также uploadите и получаете скорость upload. вот и все дела

Добавлено @ 22:53
и 2ip.ru точно также и измеряет, сначала скачивает файл, а потом закачивает и так и подсчитывает. 

Автор: wolter 28.1.2009, 10:31
shamber, Как всегда должен Вам выразить свою презнательность и сказать Вам огромное спасибо, стар положен, теперь буду копать копать и еще раз копать ))))

Автор: wolter 28.1.2009, 12:07
shamber, наверно я что то всетоки напутал после запуска у меня появляеться много групп цифр, берем серденее 
9348183.31203213b/sec
округляем
9348183b/sec
делем это число на 1024 дабы получить Kb/sec
в итоге получаем число грубо говоря 9129 (уже немного странно)
идем еще дальше умножаем полученное число на 8 дабы узнать Kbps
получаем грубо говоря 73032Kbps
далее делем это на 1024 дабы получить Мbps
получаем грубо говоря 71,3Мbps
и это при реальной скорости интернета гдето 1.8Мbps
вопрос где и что я напутал?

Автор: shamber 28.1.2009, 14:53
Что-то тут не так smile 
Давайте откажемся от фишки с callback
Код

use Time::HiRes qw[ time ];
use LWP;
my $url = 'http://www.mirrorservice.org/sites/ftp.cpan.org/pub/CPAN/authors/id/B/BZ/BZAJAC/Apache-ConfigParser-1.01.tar.gz';
my $uaw = LWP::UserAgent->new;
 $uaw->timeout(10);
   my $t0 = time;

   my $response = $ua->get($url);
 if ($response->is_success) {
     my $elapsed = time() - $t0;
     
     my $speed = length($response->content)/$elapsed;
     print "\n Speed  $speed bytes/sec by download ".length($response->content)." bytes"
    
 }
 else {
     die $response->status_line;
 }

Speed 28610.2751232511 bytes/sec by download 201739 bytes Вообщем для меня нормальная скорость smile

Автор: shamber 28.1.2009, 15:14
Все нашел свой косяк. ДЛя того чтобы работал первый варинат нужно кое-что исправить smile
Код

use strict;
use Time::HiRes qw[ time ];
use LWP;


my $url = 'http://www.mirrorservice.org/sites/ftp.cpan.org/pub/CPAN/authors/id/B/BZ/BZAJAC/Apache-ConfigParser-1.01.tar.gz';
 
 my $ua = LWP::UserAgent->new;
my $bytes = '102400';#используем для подсчета скорости
   my $t0 = time;
   my $t1 = time;
   my $file;# здесь храним содержимое
 
   my $response = $ua->get($url,':content_cb' => \&callback,':read_size_hint' => $bytes);
 if ($response->is_success) {
     my $elapsed = time() - $t0;
     my $speed = length($file)/$elapsed;
     print "\n Speed in $speed bytes/sec by download".length($file)."bytes"
    
 }
 else {
     die $response->status_line;
 }

sub callback{
    my ($data)=@_; # нужно было просто проверять, сколько было скачано за каждый раз, а не как я думал $bytes
    my $elapsed = time()- $t1;
    $file .=$data;
    my $speed = length($data)/$elapsed;
    print $speed."bytes/sec\n";
    $t1 = time();
}
 

Автор: wolter 28.1.2009, 15:27
shamber, Сейчас буду это опкапывать ) спасибо Вам ) кстати вопрос, так идет подсчет средней скорости, а как допустим вичислить максимальную или среднию, я простоне понял как работает формула ?

Автор: shamber 28.1.2009, 15:31
Цитата(wolter @  28.1.2009,  15:27 Найти цитируемый пост)
 я простоне понял как работает формула

wolter, смотрите..... 
Что такое скорость скачивания?
это количество скаченных байтов в секунду, правильно? Об этом размерность bytes/sec говорит? Вот так формула и работает

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


Автор: wolter 28.1.2009, 16:22
shamber, 
приведу пример, вот допусти скрипт возвращает данные допустим с задержкой в 1 сек 
12
43
15
36
23
вот собственно вопрос допустим естиь переменная ее начальное значени равно ничему
в нее по пере получение передаються данные 
сначала 12 потом 43 и т.д. перед тем как принятьв себя данные она проверяет допустим если первый раз значение было 12 а потом идет 43 то понятное дело что переменная запоминает значение 43 и сравнивает его с последующими данными если данные поподаються больше чем 43 она принамет значение большего числа
собственно это так как я это вижу вопрос другой где их чего мне получать данные в Вшем примере??
по поводу формулы у вас есть такая строчка которая показывает как Вы сказали средние число как она это считает ??

Автор: shamber 28.1.2009, 16:39
у меня нет строчки которая считает среднее, но если вы не можете понять куда ее вставить, то дело плохо. 
Вы понимаете что делает скрипт который я вам привел? 
Если нет, то я повторюсь, вам нужно книжки по программированию почитать.

Автор: wolter 28.1.2009, 17:15
shamber, Я то понимаю что он делает, поэтому у меня и появился вопрос увидив в Вашем коде эту строку (особенно ее комментарий)
my $speed = $size/$elapsed;# считаем среднюю скорость
как идет подсчет СРЕДЕНЕЙ скорости?

Автор: tolkien 28.1.2009, 19:21
делением естественно

Автор: shamber 28.1.2009, 21:13
wolter, средней это "образно"....
Смотри, в callback мы получаем "мгновенную" скорость(т.е. скорость при скачивании маленьких порций данных)
а в main коде мы считаем какая скорость была при скачивании файла целиком, отсюда и "средняя" скорость.
Хотя чтобы посчитать среднюю необходимо сделать несколько замеров а потом подсчитать. Так будет честнее 

Автор: wolter 29.1.2009, 10:17
ну я примернотак и думал ))) что это оброзно )

Автор: wolter 29.1.2009, 15:20
теперь буду разбираться как сделать закачку файла....

Автор: shamber 29.1.2009, 21:49
Почитайте как народ предлагает реализовать
http://www.perlmonks.org/?node_id=436810

Автор: wolter 2.2.2009, 10:38
shamber, Спасибо, но нефига не понятно ))) 

Автор: shamber 3.2.2009, 01:44
wolter, надо себя заставить smile

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