2012-05-17 13 views
5

Eventuali duplicati:
How do you throttle the bandwidth of a socket connection in C?Come limitare la velocità del socket in C?

Sto scrivendo un semplice server FTP in C per un ambiente Unix. Come funzionalità del server, voglio limitare la velocità di upload/download di un utente.

  1. Esistono funzioni di libreria che risolvono direttamente questo problema?

  2. In caso contrario, qual è l'algoritmo utilizzato in un server FTP di produzione? Ho una soluzione molto ingenua: calcola quanti byte inviare in un secondo, ad esempio x, write(x) o read(x) e quindi sleep(1).

Ci dovrebbe essere una soluzione migliore. Ancora meglio se ci sono esempi di codice.

Per essere chiari, sto usando Mac OS X, ma vorrei che potesse funzionare anche con Ubuntu o con Linux.

+0

* "Come caratteristica del server, voglio limitare la velocità di upload/download di un utente" * - Sembra una caratteristica impressionante –

+0

Su quale sistema operativo sei? – jman

+1

Questa domanda potrebbe aiutare - http://stackoverflow.com/questions/235762/how-do-you-throttle-the-bandwidth-of-a-socket-connection-in-c –

risposta

0

Sei sicuro di voler fare questo? Il tuo motivo è di infastidire i tuoi utenti? (questo è un motivo legittimo: vedere uno dei vari siti di "caricamento gratuito")

La limitazione della larghezza di banda come questa non è un buon modo per proteggere il server da sovraccarico. le persone troveranno i client con thread e apriranno sessioni FTP simultanee ...

ci sono funzioni di libreria per farlo?

Probabilmente no, la modellazione della larghezza di banda è un'attività del sistema operativo e non un'attività di servizio.

qual è l'algoritmo?

Quello che descrivi sembra piuttosto efficace.

Per renderlo migliore, è possibile osservare quanti ottetti sono stati letti o scritti e quanto tempo è stato impiegato prima di decidere di dormire. Considera il caso in cui il client è più lento del tuo limite: le letture e le scritture finiranno per bloccarsi e il tuo sleep() aggiungerà semplicemente una latenza inutile. questo ridurrà anche gli effetti nascosti della latenza del disco ecc. da parte dell'utente.

Si potrebbe considerare l'utilizzo di noi addormentati o nanosleep per una risoluzione migliore entrambi sono in posix quindi dovrebbero essere su OSX * BSD e linux.

0

FTP è un protocollo a livello di applicazione. FTP può essere eseguito su socket TCP o UDP. (EDIT: TFTP e uftp gira su UDP, pls vede la sezione di commento per i dettagli)

Il Socket velocità è una funzione di seguito:

  1. collegamento Velocità: 10/100 Base T e così via.
  2. BER del collegamento: Bit Tasso di errore (in genere nel mondo di oggi è generalmente basso 10 alla potenza -9 o qualcosa del genere. Ci sono anche errori di burst.
  3. formati Socket Buffer: /proc/sys/net/core parametri

In Linux: Per la movimentazione dei socket TCP qui un buon articolo [1]

4.Tweak la pila per filtrare/pacchetti goccia di introdurre la perdita di pacchetti, quindi alla fine la strozzatura della portata: strumenti come netem [2] aiutano a regolare i secchi per limitare i flussi.

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

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

+2

"FTP può essere eseguito su socket UDP" ... questa richiesta richiede evidenza. –

+1

Per evitare la discussione da digressione a FTP non ho fornito i dettagli lì. 1. tftp gira su porta udp 69 per la velocità. 2. C'è uftp che è un trasferimento di file multi cast che fornisce la crittografia per sicurezza. –

+1

TFTP trasferisce i file, ma non è FTP. Idem così. –

Problemi correlati