Bandbreite einschränken.



  • Hi,
    ihr kennt das von zb. Downloadmangern das man da einfach ein max von 30Kb/s einstellen kann und der Download ist dann auch ca. bei den 30Kb/s.

    Wie mache ich sowas?
    Ich habe eine Schleife in der ich die Daten aus dem Stream in eine Datei schreibe.Ich kann zwar mit sleep(x) den Download verlangsamen aber das ist absolut ungenau.

    Also ich bin für jede Idee dankbar.



  • Hmm... gute Frage. Ich überlege einfach mal mit.

    Wie wäre es mit dem Token Bucket Algorithmus?
    http://de.wikipedia.org/wiki/Token-Bucket-Algorithmus
    http://en.wikipedia.org/wiki/Token_bucket

    Die Idee ist einfach:
    Per Zeitgeber (1 Takt pro Sekund) zählst Du (z.B. im seperaten Thread) einen Zähler um die Anzahl der gewünschten Tokens hoch. Der Zähler entspricht den Bucket (Deutsch: Eimer) und die Anzahl der Tokens der gewünschten Geschwindigkeit. So zählst Du bei einer gewünschten Geschwindigkeit von 30kB/Sekunde den Zähler um 30 pro Sekunde hoch.

    In einer Schleife liest Du nun nur so viele Daten aus dem Stream (oder Socket) wieviele der Zähler aktuell hat und ziehst die Anzahl entsprechend nach dem lesen wieder ab. Ist der Zähler/Eimer auf 0 dann blockiert die Schleife (oder läuft ohne was zu tun durch) bis der Zähler/Eimer wieder > 0 ist.

    Optional:
    Hat der Zähler einen bestimmten Maximalwert MAX (Eimer voll) erreicht, dann wird nicht mehr weiter hochgezählt (d.h. die Tokens passen nicht mehr in den Eimer), bis der Stand wieder abgesunken ist. Der Wert MAX determiniert also die maximale größe der sogenanten Bursts.

    Ich hoffe ich konnte Dir helfen 🙂


Anmelden zum Antworten