View Full Version : Limitare throughput socket in C/C++ o Java
Ciao!
Dovrei realizzare un programma in grado di limitare la "velocità" con cui invia i dati via socket tcp (stile sw di filesharing, dove è possibile indicare la velocità up/down max). C/C++ o Java è indifferente (per C/C++ intendo le classiche BSD-style).
Mi basta agire su qualche parametro? Non ho molto tempo, sapete se esiste qualcosa di già pronto?
ciao
- s -
Dovrei realizzare un programma in grado di limitare la "velocità" con cui invia i dati via socket tcp (stile sw di filesharing, dove è possibile indicare la velocità up/down max). C/C++ o Java è indifferente (per C/C++ intendo le classiche BSD-style).
Mi basta agire su qualche parametro? Non ho molto tempo, sapete se esiste qualcosa di già pronto?Per qualcosa di già pronto non saprei cosa dirti ... dovresti fare una ricerca in rete.
Dal punto di vista concettuale non è difficilissimo: innanzitutto non puoi alterare la velocità di trasmissione dei pacchetti sul mezzo fisico di trasporto. Per esempio su una rete LAN a 100 Mbps, salvo congestioni o problemi vari, i pacchetti viaggiano appunto a 100 Mbps. E quello è.
Però puoi ritardare/rallentare l'invio dei pacchetti facendo in modo che nell'unità di tempo (1 secondo) vengano inviati solamente un tot di dati.
Come farlo tecnicamente non saprei dire perché non me ne sono mai occupato.
Per qualcosa di già pronto non saprei cosa dirti ... dovresti fare una ricerca in rete.
Dal punto di vista concettuale non è difficilissimo: innanzitutto non puoi alterare la velocità di trasmissione dei pacchetti sul mezzo fisico di trasporto. Per esempio su una rete LAN a 100 Mbps, salvo congestioni o problemi vari, i pacchetti viaggiano appunto a 100 Mbps. E quello è.
Però puoi ritardare/rallentare l'invio dei pacchetti facendo in modo che nell'unità di tempo (1 secondo) vengano inviati solamente un tot di dati.
Come farlo tecnicamente non saprei dire perché non me ne sono mai occupato.
cosi a sentimento introdurrei un layer (oggetto) fra chi scrive il dato e il buffer di trasmissione tcp/udp. Questo strato controllerebbe quanto scrive sul buffer tcp/udp, e superata una certa soglia al sec, si bloccherebbe.
Per la temporizzazione, ti memorizzi il time-stamp dell'inizo del "secondo" in cui vuoi inviare i tuoi 3KB(per esempio).
Spedisci 3KB.
Controlli se è gia passato un secondo.
Se si, vai in sleep per il tempo rimanente.
Altrimenti rinnovi il time-stamp dell'inizio del tuo secondo(questo puoi farlo in varie maniere...) e continui a spedire finche non riscrivi 3KB.
Grazie per i suggerimenti!
Si si la soluzione piu' diretta credo sia l'introduzione di un layer per incapsulare le socket base ed introdurre un conteggio dei kb inviabili per secondo (non si tratta di una sola connessione TCP, ma di un insieme di connessioni verso piu' macchine in rete).. ..e se il limite in velocità non fosse fissato a priori ma dinamico, in base alle reali capacità della macchina in rete? (non in LAN, ma su internet)
(beh, ovviamente se ho una connessione analogica 56k, arrivato a trasmettere a 56kbps, qualsiasi prog non andrebbe oltre e sarebbe limitato a 56Kbps! :rolleyes: forse sto sbagliando qualcosa.. ..dovrei tenere conto che in realtà ho bisogno di trasmettere i dati quasi in realtime!)
buttare via i pacchetti "vecchi" non spediti? mmm.. e se passassi a qualche protocollo tipo RTP ? :mc:
Non so se è chiaro il mio problema, ma che ne pensate?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.