2012-05-17 10 views
5

Mögliche Duplizieren:
How do you throttle the bandwidth of a socket connection in C?Wie kann ich die Socket-Geschwindigkeit in C begrenzen?

Ich bin für eine Unix-Umgebung einen einfachen FTP-Server in C zu schreiben. Als eine Funktion des Servers möchte ich die Upload-/Download-Geschwindigkeit eines Benutzers begrenzen.

  1. Gibt es Bibliothekfunktionen, die dieses Problem direkt lösen?

  2. Wenn nicht, welcher Algorithmus wird in einem FTP-Produktionsserver verwendet? Ich habe eine sehr naive Lösung: Berechnen, wie viele Bytes in einer Sekunde, sagen x, write(x) oder read(x), und dann sleep(1).

Es sollte eine bessere Lösung geben. Noch besser, wenn es Codebeispiele gibt.

Um klar zu sein, ich benutze Mac OS X, aber ich wünschte, es könnte auch unter Ubuntu oder Linux laufen.

+0

* "Als Merkmal des Servers, möchte ich den Upload/Download-Geschwindigkeit eines Benutzers begrenzen" * - Das klingt nach einem tollen Feature –

+0

Auf welchem ​​Betriebssystem bist du? – jman

+1

Diese Frage könnte helfen - http://StackOverflow.com/Questions/235762/how-do-you-Throttle-the-bandwidth-of-a-Socket-connection-in-c –

Antwort

0

Sind Sie sicher, dass Sie das tun möchten? Ist Ihr Motiv, Ihre Benutzer zu nerven? (Dies ist ein legitimes Motiv - siehe einige der "kostenlosen Upload" -Sites)

Bandbreitenbegrenzung wie diese ist keine gute Möglichkeit, Ihren Server vor Überlastung zu schützen. Menschen werden Thread-Clients finden und gleichzeitige FTP-Sitzungen öffnen ...

Gibt es irgendwelche Bibliotheksfunktionen, das zu tun?

Wahrscheinlich nicht, Bandbreite Shaping ist eine OS-Task keine Service-Aufgabe.

Was ist der Algorithmus?

Der von Ihnen beschriebene klingt ziemlich effektiv.

Um es besser zu machen, könnte man schauen, wie viele Oktette gelesen oder geschrieben wurden und wie viel Zeit man verbracht hat, bevor man sich für den Schlaf entscheidet. Stellen Sie sich den Fall vor, dass der Client langsamer als Ihr Limit ist: Die Lese- und Schreibvorgänge werden blockiert, und Ihr sleep() fügt nur unnötige Latenz hinzu. Dies reduziert auch die Auswirkungen der Festplattenlatenz usw. auf den Benutzer.

Sie könnten die Verwendung von usleep oder nanosleep für feinere Auflösung beide in posix so sollte auf OSX * BSD und Linux sein.

0

FTP ist ein Anwendungsschichtprotokoll. FTP kann auf TCP- oder UDP-Sockets ausgeführt werden. (EDIT: tftp und uftp läuft auf udp, pls sehen den Kommentar Abschnitt)

Die Socket-Geschwindigkeit ist eine Funktion der folgenden:

  1. Link Geschwindigkeit: 10/100 Base T und so weiter.
  2. BER der Verbindung: Bit Fehlerrate (typischerweise in der heutigen Welt seine im Allgemeinen niedrige 10 an die Macht -9 oder etwas dieser Art. Es gibt auch Burst-Fehler.
  3. Sockel Puffergrößen: /proc/sys/net/core Parameter

Unter Linux: Für das TCP-Sockets hier ist ein guter Artikel [1]

4.Tweak des Stapel zu filtern/Drop-Pakete Umgang mit dem Paketverlust einzuführen, Dadurch wird die Durchflussmenge gedrosselt: Werkzeuge wie neet [2] helfen Ihnen, die Behälter so einzustellen, dass die Durchflussmengen gedrosselt werden.

[1] http://www.cyberciti.biz/faq/linux-tcp-tuning/

[2] http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

+2

"FTP kann auf UDP-Sockets laufen" ... dieser Anspruch erfordert Beweise. –

+1

Um die Diskussion von Exkurs zu FTP zu vermeiden, habe ich dort keine Details angegeben. 1. tftp läuft auf UDP-Port 69 für Geschwindigkeit. 2. Es gibt eine UFTP-Dateiübertragung, die eine Verschlüsselung für die Sicherheit bietet. –

+1

TFTP überträgt Dateien, aber es ist nicht FTP. Dito Uftp. –

Verwandte Themen