In which case, I'd suggest trying something like a cgi that does:
(No code I'm afraid, I don't have my real computer to experiment with)
- Takes a time stamp (maybe using Time::HiRes)
- Prints a load of data to the browser in comments (note, make sure that 'autoflush' is on)
- Takes another timestamp and compares the two. Given your known quantity of data transmitted you should be able to figure out bandwidth.
I'm not 100% certain that a CGI will pause if a buffer overflows. If it doesn't, then what you'd need to do is something smart with multipart mime, to refresh to another CGI.
The trick I picked up from bigbrother (http://bb4.com) is to print multipart mime pages, and then you can stick a refresh header in it at the bottom. So you have your 'big' page, that prints out, hits the refresh 0 and then redirects to your 'finished' page. That compares the timestamps, and prints an output.
I have an example, but not handy. If someone doesn't beat me to it, I'll try and remember to post it tomorrow.
| [reply] |
OK, here's an example that seems to work. Not very pretty, I know :)
Accuracy of this test will increase with larger data sizes, since then you're reducing the percentage overhead introduced by server load, general cgi speed etc.
Seems to work with my quick testing, but YMMV.
(Oh and I had to retype this a couple of times, since the textbox likes to clear whenever I hit 'ESC'. Damn those 'vi' fingers)
#!/bin/perl
use warnings;
use strict;
use Time::HiRes qw ( gettimeofday ) ;
my $data = "E"x1020; #start with using 1k blocks shall we?
my %cgi_vars;
foreach my $pair ( split ( "&", $ENV{'QUERY_STRING'} ) )
{
my ( $var, $val ) = split ("=", $pair);
$cgi_vars{$var} = $val;
}
#cgi headers:
print "content-type: text/html\n\n";
#take time
my ( $start_seconds, $start_microseconds ) = gettimeofday;
print "$start_seconds $start_microseconds<BR/>\n";
#print stuff to thingy
if ( $cgi_vars{"data_size"} )
{
for ( my $count=0; $count < $cgi_vars{"data_size"}; $count++ )
{
print "<!",$data,"->\n";
}
}
#take time.
my ( $end_seconds, $end_microseconds ) = gettimeofday;
print "$end_seconds $end_microseconds<BR/>\n";
#compare.
my $time_delta = ($end_seconds - $start_seconds) + ( ( $end_microsecon
+ds - $start_microseconds) / 1000000);
if ( $cgi_vars{"data_size"} )
{
print "your data transfer of ", $cgi_vars{"data_size"}, "k took ", $
+time_delta, " seconds<BR/>\n";
print "your bandwidth is ",$cgi_vars{"data_size"} / $time_delta ," k
+ilobytes/sec<BR/>\n";
}
else
{
print "please invoke as $ENV{'SCRIPT_NAME'}?data_size=100<BR/> \n";
}
| [reply] [d/l] |
Thanks so much you're a life saver I will test thisout today and let you know how things go.
| [reply] |
Quick question for you did you have to do anything special to get this to run correctly?? I am getting a print out that says "please invoke as /cgi-bin/speed_test.cgi?data_size=100 . Does this mean anything to you??
Here is my basic HTML for testing:
<form name="form1" method="get" action="/cgi-bin/speed_test.cgi">
<input type="submit" name="Submit" value="Start">
</form>
| [reply] [d/l] |
It means that you need a field in the cgi for 'data_size'.
I'd suggest adding (iirc):
<INPUT TYPE="HIDDEN" NAME="data_size" VALUE=100>
in your form (could be wrong there).
Basically, you're looking for a URL that looks something like: http://www.myserver.net/cgi-bin/speed_test.cgi?data_size=100
You could always hardcode the data size though, depending on what suits you.
| [reply] [d/l] [select] |