Seite 1 von 5

Internet Speedtest

Verfasst: Freitag 21. Oktober 2011, 08:41
von Campionissimo
Hallo Zusammen,

weiß jemand, wie ich einen Inernet Speedtest per Programmcode machen könnte ?
Downloadlink & Uplink
Oder gibt da schon was?

Vielen Dank

Re: Internet Speedtest

Verfasst: Montag 24. Oktober 2011, 12:23
von Leonidas
Etwas mit bekannter größe runterladen und schauen wie lange es gedauert hat, und analog auch hochladen. Und zum Runter- und Hochladen am besten ein CDN verwenden, so dass immer schnelle Edge-Server in der Nähe des Users stehen. Ich hab hier eine ca. 3 MB/s-Anbindung, aber einige Sachen tröpfeln nur mit 200 Kbyte/s rein, sowas vereitelt die "Messung".

Re: Internet Speedtest

Verfasst: Mittwoch 26. Oktober 2011, 19:39
von Campionissimo
Danke für die Antwort. Sowas habe ich schon geschrieben. Weiß aber nicht, ob meine Messung so wirklich stimmt. Ich habe mal eine kleine Datei heruntergeladen und eine größere. Dieser Werte unterscheiden sich aber extrem ;(

Re: Internet Speedtest

Verfasst: Donnerstag 27. Oktober 2011, 07:11
von jens
Grundsätzlich kann so ein Speedtest eigentlich nur die aktuelle Geschwindigkeit zwischen einem selbst und dem genutzten Server aufzeigen. Dazwischen sind allerdings auch noch einige Zwischenstationen... Somit kann man die tatsächliche Verbindungsgeschwindigkeit nicht wirklich zuverlässig ermitteln.

Also egal wie man es macht, es ist nur ein Näherungswert und einem Momentaufnahme...

Schau dir mal an, wie es http://www.wieistmeineip.de/speedtest/ macht. Ich hab es mal mit Firebug beobachtet:
Es wird eine Anfrage wie http://speedtest-smk.wieistmeineip.de/u ... hp?size=64 per GET an den Server geschickt. Der liefert dann eine HTML Seite mit einer Formular zurück. In einem versteckten Feld sind anscheinend Zufallsdaten mit entsprechender Größe. Das Formular wird dann wieder per POST an den Server gesendet.
Mit Javascript werden die Zeiten aufaddiert.

Irgendwie nicht sonderlich kompliziert. Der JS Code ist auch recht leserlich und nachvollziehbar. Wäre IMHO nicht all zu viel Arbeit das nach zu bauen.

Aber wozu eigentlich?

Re: Internet Speedtest

Verfasst: Mittwoch 21. Dezember 2016, 08:58
von Nr8
Hi,
ich benutze folgendes Programm um mir alle zwei Sekunden die Datenrate ausgeben zu lassen.

Code: Alles auswählen

#!/usr/bin/python
import urllib2
import urllib
import time
from datetime import datetime
import sys
import os
 

# Geschwindigkeit messen
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=2, buf=10):
 
f = urllib2.urlopen(url)
tStart = datetime.now()
amount = 0
x = 0
 
while ((len(f.read(buf))==buf) & (x<= 60)):
                tEnd = datetime.now()
dif = (tEnd - tStart).total_seconds()

    
if (dif >= intervall):
                        
# print (time.strftime("%H:%M:%S; ")),((((amount/intervall)/1000.00)*8)/1024), "Mbit/s;"
                        amount = 0
                        tStart = datetime.now()
                        x = x + 1
        
else:
amount = amount + buf
 
try:
measure (buf=1024, intervall=2)
 
 
except  KeyboardInterrupt:
exit(0)

Sobald meine Internetverbindung abbricht erhalte ich folgenden Fehler.

Traceback (most recent call last):

File "./peedneu.py", line 43, in <module>

measure (buf=1024, intervall=2)

File "./Speedneu.py", line 18, in measure

f = urllib2.urlopen(url)

File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen

return opener.open(url, data, timeout)

File "/usr/lib/python2.7/urllib2.py", line 431, in open

response = self._open(req, data)

File "/usr/lib/python2.7/urllib2.py", line 449, in _open

'_open', req)

File "/usr/lib/python2.7/urllib2.py", line 409, in _call_chain

result = func(*args)

File "/usr/lib/python2.7/urllib2.py", line 1227, in http_open

return self.do_open(httplib.HTTPConnection, req)

File "/usr/lib/python2.7/urllib2.py", line 1197, in do_open

raise URLError(err)

urllib2.URLError: <urlopen error [Errno -2] Name or service not known>



Ich würde aber gern eine Ausgabe mit 0Mbit/s haben, bis meine die Downloadrate wieder berechnet werden kann.

Kennt da irgendwer eine Lösung für mein Problem.

Re: Internet Speedtest

Verfasst: Mittwoch 21. Dezember 2016, 09:51
von BlackJack
@Nr8: Die Einrückung in dem Quelltext ist kaputt‽

Die Lösung dürfte mit der Behandlung dieser Ausnahme in Deinem Code zu tun haben.

Re: Internet Speedtest

Verfasst: Mittwoch 21. Dezember 2016, 09:57
von noisefloor
Hallo,

das bit-weise `&` in der `while` Schleife ist wohl auch falsch... da soll doch wohl an `and` hin, oder?

Gruß, noisefloor

Re: Internet Speedtest

Verfasst: Mittwoch 21. Dezember 2016, 10:17
von Nr8
Ich bekomme aber die Werte, wenn die Internetverbindung steht. Die Probleme treten nur auf, wenn kein Empfang ist.

Re: Internet Speedtest

Verfasst: Mittwoch 21. Dezember 2016, 10:46
von noisefloor
Hallo,

das das `&` an der Stelle funktioniert liegt auch nur daran, dass z.B. `True & True` das gleiche Ergebnis gibt wie `True and True`. Richtig ist bit-weise Operation trotzdem an der Stelle nicht.

Ansonsten hat BlackJack doch schon das Stichwort gegeben: Exception-Handling der betreffenden Zeile, in der der Fehler auftritt.

Gruß, noisefloor

Re: Internet Speedtest

Verfasst: Mittwoch 21. Dezember 2016, 10:51
von Nr8
Da kenne ich mich leider nicht aus.
Ich würde

try:

f = urllib2.urlopen(URL)

except ???????????

was kommt bei except hin?

Re: Internet Speedtest

Verfasst: Mittwoch 21. Dezember 2016, 11:41
von Sirius3
@Nr8: der Fehler, der auftritt, steht in der letzten Zeile: urllib2.URLError

Re: Internet Speedtest

Verfasst: Mittwoch 21. Dezember 2016, 12:10
von Nr8
Super, ihr seid die Besten!!!!!!!!!!

Re: Internet Speedtest

Verfasst: Mittwoch 21. Dezember 2016, 13:14
von Nr8
Jetzt möchte ich noch gern in der except ein bash-Script ausführen und die Internetverbindung wiederherstellen.

Re: Internet Speedtest

Verfasst: Mittwoch 21. Dezember 2016, 13:26
von BlackJack
@Nr8: Zum Ausführen von externen Programmen gibt es das `subprocess`-Modul in der Standardbibliothek.

Re: Internet Speedtest

Verfasst: Mittwoch 21. Dezember 2016, 13:43
von Nr8
danke! hat geklappt

Re: Internet Speedtest

Verfasst: Donnerstag 22. Dezember 2016, 07:51
von Nr8
Also wenn ich den try: except über der while-Schleife schreibe geht es gut aber in der while-Schleife gibt er mir einen Fehler aus.

Code:

Code: Alles auswählen

#!/usr/bin/python
import urllib2
import urllib
import time
from datetime import datetime
import subprocess
import sys
import os

LON = 0
LAT = 0
# Geschwindigkeit messen
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=3, buf=10):
       # try:
                f = urllib.urlopen(url)
        #except IOError:
       #         subprocess.call(["./Verbindungsaufbau"])
#        exit(0)
 #               print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
  #      except IndexError:
   #             print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
    #            exit(0)
     #   else:   
                tStart = datetime.now()
                amount = 0
                x = 0
    while ((len(f.read(buf))==buf) and (x<= 6)):
                try:
                        f = urllib.urlopen(url)
                except IOError:
                        subprocess.call(["./Verbindungsaufbau"])
                        exit(0)
                        print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
                else:
                        tEnd = datetime.now()
                        dif = (tEnd - tStart).total_seconds()
                        LAT=sys.argv[1]
                        LON=sys.argv[2]
                        if (dif >= intervall):
                                print (time.strftime("%H:%M:%S; ")),((((amount/intervall)/1000.00)*8)/1024), "Mbit/s;", LAT ,";" , LON
                                amount = 0
                                tStart = datetime.now()
                                x = x + 1       
    
                        else:
                                amount = amount + buf

try:
    measure(buf=1000, intervall=3)
except  KeyboardInterrupt:
    exit(0)

Re: Internet Speedtest

Verfasst: Donnerstag 22. Dezember 2016, 08:18
von noisefloor
Hallo,

solange du dein Programm hier ohne korrekte Einrückungen postest, kann man eher wenig sagen. Den Code bitte in einen Codeblock setzen, dann werden auch die Einrückungen übernommen.

Außerdem ist es hilfreich, wenn du die _komplette_ Fehlermeldung postest. "Geht nicht" ist wenig hilfreich...

Gruß, noisefloor

Re: Internet Speedtest

Verfasst: Donnerstag 22. Dezember 2016, 08:41
von Nr8
Oh Entschuldigung.

Fehler:

[codebox=text file=Unbenannt.txt] File "./Spee.py", line 32
while ((len(f.read(buf))==buf) and (x<= 6)):
^
IndentationError: unindent does not match any outer indentation level
[/code]

Code: Alles auswählen

#!/usr/bin/python
import urllib2
import urllib
import time
from datetime import datetime
import subprocess
import sys
import os

LON = 0
LAT = 0
# Geschwindigkeit messen
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=3, buf=10):
       # try:
                f = urllib.urlopen(url)
        #except IOError:
       #         subprocess.call(["./Verbindungsaufbau"])
#        exit(0)
 #               print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
  #      except IndexError:
   #             print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
    #            exit(0)
     #   else:   
                tStart = datetime.now()
                amount = 0
                x = 0
    while ((len(f.read(buf))==buf) and (x<= 6)):
               # LON = 0
                #LAT = 0
                try:
                        f = urllib.urlopen(url)
                except IOError:
                        subprocess.call(["./Verbindungsaufbau"])
                        exit(0)
                        print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
                else:
                        tEnd = datetime.now()
                        dif = (tEnd - tStart).total_seconds()
                        LAT=sys.argv[1]
                        LON=sys.argv[2]
                        if (dif >= intervall):
                                print (time.strftime("%H:%M:%S; ")),((((amount/intervall)/1000.00)*8)/1024), "Mbit/s;", LAT ,";" , LON
                                amount = 0
                                tStart = datetime.now()
                                x = x + 1       
    
                        else:
                                amount = amount + buf

try:
    measure(buf=1000, intervall=3)
except  KeyboardInterrupt:
    exit(0)

Re: Internet Speedtest

Verfasst: Donnerstag 22. Dezember 2016, 09:49
von Sirius3
@Nr8: der Fehler ist doch eindeutig. Einrückungen sind in Python syntaktisch relevant. Du solltest **immer** mit 4 Leerzeichen pro Ebene einrücken und Dir einen Editor suchen, der Blockkommentare beherrscht. Innerhalb der while-Schleife solltest Du nicht versuchen eine neue Verbindung aufzubauen. Das macht keinen Sinn. Und `exit` gehört in keine Funktion. Großgeschriebene Variablennamen sind per Konvention Konstanten, LAT und LON werden aber verändert, und dann noch mit sys.argv, was an dieser Stelle auch überraschend ist. Überraschungen mögen Programmierer nicht. while und if brauchen keine Klammern um die Bedingung. Also weg damit.

Re: Internet Speedtest

Verfasst: Donnerstag 22. Dezember 2016, 09:57
von BlackJack
@Nr8: Die Meldung sagt es doch eigentlich sehr deutlich, die Einrückungstiefe von der ``while``-Schleife passt nicht zu der äusseren Einrückungstiefe. Das ist weder so weit eingerückt wie die Zeilen die zu der Funktion gehören, noch so weit eingerückt wie die Zeilen die nicht mehr zu der Funktion gehören. Und da der Compiler anhand der Einrückungstiefe abliest zu welchem Block Codezeilen gehören sollen, weiss er nicht was er damit anfangen soll.

Einrückungstiefe ist per Konvention übrigens vier Leerzeichen pro Ebene.

Wenn ich mir die Zeilen 18 bis 23 anschaue solltest Du entweder die Funktionen Deines Editors besser kennenlernen oder einen anderen Editor verwenden, denn jeder gute Texteditor bietet die Möglichkeit einen markierten Zeilenblock komplett ein- oder auszukommentieren. Das dürfte schneller und weniger fehleanfällig gehen als das manuell für jede Zeile zu machen.

Kein einziger `exit()`-Aufruf in dem Programm ist wirklich nötig, auch die im auskommentierten Code nicht. Mit dieser Funktion sollte man sehr sparsam umgehen weil das eine recht drastische Vorgehensweise ist, die es schwierig machen kann Veränderungen vorzunehmen, wenn man beispielsweise ein Programm doch nicht beenden möchte, oder eine Funktion verwenden möchte ohne das in bestimmten Fällen gleich das gesamte Programm beendet wird.

Zudem muss das eigentlich ``sys.exit()`` heissen, denn offiziell gibt es die `exit()`-Funktion so gar nicht.

Bei den Bedingungen bei ``while`` und ``if`` sind sämtliche Klammern überflüssig.

`LAT` und `LON` sind wie Konstanten geschrieben, sind aber keine Konstanten. Das die in der `measure()`-Funktion aus den Kommandozeilenargumenten geholt werden, ist ein wenig undurchsichtig.

Und noch mal inhaltlich zum Programm: Der Ablauf macht *so* wenig bis gar keinen Sinn. Ich persönlich würde auch die Zeitmessung und die Ausgabe voneinander trennen.