2012-05-17 20 views
5

Powiel możliwe:
How do you throttle the bandwidth of a socket connection in C?Jak ograniczyć prędkość gniazda w C?

Piszę prosty serwer FTP w C w środowisku Unix. Jako cechę serwera chcę ograniczyć prędkość wysyłania/pobierania użytkownika.

  1. Czy istnieją jakieś funkcje biblioteczne bezpośrednio rozwiązują ten problem?

  2. Jeśli nie, to jaki algorytm jest używany w produkcyjnym serwerze FTP? Mam bardzo naiwne rozwiązanie: obliczyć, ile bajtów wysłać w ciągu sekundy, na przykład x, write(x) lub read(x), a następnie sleep(1).

Powinno być lepsze rozwiązanie. Jeszcze lepiej, jeśli są próbki kodu.

Dla jasności, używam Mac OS X, ale chciałbym, żeby mógł działać również pod Ubuntu lub Linux.

+0

* "Jako funkcję serwera, chcę, aby ograniczyć prędkość wysyłania/pobierania z użytkownikiem" * - To brzmi jak niesamowite cechą –

+0

Na jakim systemie operacyjnym jesteś? – jman

+1

To pytanie może pomóc - http://stackoverflow.com/questions/235762/how-do-you-throttle-the-bandwidth-of-a-socket-connection-in-c –

Odpowiedz

0

Czy na pewno chcesz to zrobić? Czy Twój motyw do irytacji użytkowników? (jest to uzasadniony powód - zobacz jedną z wielu witryn "darmowych przesyłek")

Ograniczanie przepustowości w ten sposób nie jest dobrym sposobem ochrony serwera przed przeciążeniem. ludzie znajdą klientów z gwintem i otwierają równoczesne sesje FTP ...

Czy są jakieś funkcje biblioteczne do tego?

Prawdopodobnie nie, kształtowanie przepustowości jest zadaniem systemu operacyjnego, a nie zadaniem usługi.

jaki jest algorytm?

Opisany przez Ciebie dźwięk jest dość skuteczny.

Aby było lepiej, można by sprawdzić, ile oktetów zostało przeczytanych lub zapisanych oraz ile czasu zostało poświęconych na podjęcie decyzji o śnie. Rozważmy przypadek, w którym klient jest wolniejszy od limitu: czytanie i zapis zakończy się zablokowaniem, a twój sen() po prostu doda niepotrzebne opóźnienie. to także zmniejszy efekt ukrywania opóźnienia dysku itp. od użytkownika.

Można rozważyć użycie trybu uśpienia lub trybu nanośszego dla lepszej rozdzielczości oba są w posix, więc powinny być na OSX * BSD i Linux.

0

FTP to protokół warstwy aplikacji. FTP może działać na gniazdach TCP lub UDP. (EDIT: tftp i uftp działa na UDP, pls patrz rozdział komentarz do szczegółów)

Socket prędkości jest funkcją następujących:

  1. Link Speed: 10/100 Base T i tak dalej.
  2. BER linku: Bit Error rate (zazwyczaj w dzisiejszym świecie jest generalnie niski 10 do potęgi -9 lub czegoś podobnego).
  3. rozmiary Socket bufor: /proc/sys/net/core parametry

w systemie Linux: do obsługi gniazd TCP tu jest dobry artykuł [1]

4.Tweak stos filtrować/pakiety spaść do wprowadzenia utraty pakietów, w ten sposób ostatecznie dławiąc szybkość przepływu: Narzędzia takie jak netem [2] pomagają dostosować czerpaki do dławienia przepływów.

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

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

+2

"FTP może działać na gniazdach UDP" ... to roszczenie wymaga dowodu. –

+1

Aby uniknąć dyskusji z dygresji na FTP, nie podałem tam szczegółów. 1. tftp działa na porcie udp 69 dla prędkości. 2. Istnieje uftp, który jest przesyłaniem plików multi-cast, który zapewnia szyfrowanie dla bezpieczeństwa. –

+1

TFTP przesyła pliki, ale nie jest to FTP. Ditto uftp. –