Przerobienie skryptu w perl

Witam!

Czy da się przerobić :arrow:TEN skrypt tak aby zamiast wyświetlania ile bajtów przesłano, pokazywał prędkość wysyłania ?

Pozdrawiam.

Nie powinno być problemów. Ogólnie chodzi o ten kawałek kodu:

while ($cursize < $size) {

  $bufferlen = sysread($fh, $buffer, $maxbufsize, 0) || 0;

  unless ($bufferlen) { die "Error while sending data: $!\n" }

  print "$cursize of $size bytes sent.\n";

  $cursize += $bufferlen;

  print $socket $buffer;

}

Wystarczy, że obliczysz czas wysyłanie, np. za pomocą Time::HiRes::time (pobierasz czas przed wysłaniem, po wysłaniu i różnica to będzie mniej więcej czas wysyłania). Ilość wysłanych danych dzielisz przez ten czas i powinno działać.

Hmm, a mógłbyś mi to napisać ?

Głupio mi tak pisać, ale na prawdę, ten skrypt nie jest mój, a o perlu to nawet nie czytałem…

Pozdrawiam.

Spróbuj zmodyfikować kod w taki sposób:

...

	use IO::Socket;

use Time::HiRes qw();


my($time0, $time1, $timediff, $curspeed);

	my(...)


	...


	$bufferlen = sysread($fh, $buffer, $maxbufsize, 0) || 0;

	unless ($bufferlen) { die "Error while sending data: $!\n" }

	print "$cursize of $size bytes sent.\n";

	$cursize += $bufferlen;

$time0 = Time::HiRes::time;

	print $socket $buffer;

$time1 = Time::HiRes::time;

$timediff = $time1 - $time0;

$curspeed = $timediff != 0 ? $bufferlen / $timediff : 0;

printf "%.2f KiB/s\n", $curspeed / 1024;

Kod do wstawienia jest bez wcięcia, z wcięciem stary kod. Na początek deklarujesz zmienne oraz importujesz moduł Time::HiRes. Potem modyfikujesz wspomnianą pętlę while, jak pokazano.

Dzięki, ale jest błąd:

plik.png

U mnie 107 to jest to:

$curspeed = $timediff != 0 ? $bufferlen / $timedeff : 0;

Pozdrawiam.

Wybacz, literówka. Oczywiście ma być timediff, nie mam pojęcia czemu napisałem timedeff.

$curspeed = $timediff != 0 ? $bufferlen / $timediff : 0;

No ale tego się można było domyślić, skoro wprowadziłem 4 zmienne ($time0, $time1, $timediff, $curspeed) :stuck_out_tongue:

Jakiś błąd chyba jest bo pisze że:

A to wychodzi chyba 8.388608 gb, co jest nie możliwe bo plik 40mb wysyłało chwile.

Pozdrawiam.

Oczywiście zrobiłem najgłupszy z możliwych błędów, tj. odejmowałem czas wcześniejszy od późniejszego. Kod powyżej poprawiony, powiedz czy teraz daje sensowne wyniki.

// edit przetestowałem plik na kopiowaniu pliku na dysku (nie przez sieć) i daje zawyżone wyniki, szczerze nie wiem czy to tylko kwestia niedokładności obliczeń czy też coś innego.

Działa.

Zawyżone ? Hmm no nie wiem jak to sprawdzić.

Ale mam jeszcze pytanie czy ten skrypt nie ogranicza gdzieś prędkości ?

Bo na shellu nie przekracza 1010KiB/s, a jak uploaduje z tego samego shella przez ftp, to idzie spokojnie 6mB/s