Avatar billede vandborg Nybegynder
20. oktober 2004 - 14:57 Der er 8 kommentarer og
1 løsning

Maksimum hastighed på recv

Hej Eksperter!

Jeg har eksperimenteret med winsock i noget tid nu, og har kastet mig ud i at kode en download klient via http protokollen. Programmet virker fint, men jeg vil gerne finde den mest optimale måde at implementere en hastighedsbegrænsning, når der hentes med recv().

Hvis en meget lav hastighed specificeres (fx 0,5 kb/s) ønsker jeg stadig at programmet henter med denne konstante hastighed, så muligheden med at udnytte Sleep() er udelukket.

På forhånd tak og håber jeg har gjort mig forståelig,
/Vandborg
Avatar billede vandborg Nybegynder
20. oktober 2004 - 15:02 #1
Efter videre eftertanke kan det egentlig godt være Sleep() stadigvæk kan udnyttes. Overvejer at lave en dynamisk buffer afhængig af maks. hastighedens størrelse, og derefter udnytte Sleep(). Ved bare ikke om dette er en optimal måde at gøre det på.
Avatar billede arne_v Ekspert
20. oktober 2004 - 15:11 #2
Spørgsmål ikke sforstået.

Hvis du bruger en blocking socket, så har du ikke noget at bruge
Sleep til.

Hvis du bruger en non blocking socket, så skal du vel øge Sleep tid
ved lidt data og mindske Sleep tid ved meget data !?
Avatar billede vandborg Nybegynder
20. oktober 2004 - 15:37 #3
Hovsa, jeg bruger en blocking socket. Som compiler bruges der MS Visual C++ 6.0. Er det så muligt at lave en hastigheds begrænsning?
Avatar billede arne_v Ekspert
20. oktober 2004 - 15:46 #4
Ah. Jeg tror ikke at jeg fik læst dit spørgsmål grundigt nok i første gang.

Du vil ikke sleepe for at få dit program til at virke. Du vil sleepe
for at begrænse båndbredden.

Kan du ikke snuppe tiden før recv og efter recv. Og så beregne hvor
lang tid du skal sleepe. Noget a la:

if(nbyt/(t2-t1) > limit)
{
  Sleep(nbyt/limit-(t2-t1));
}
Avatar billede arne_v Ekspert
20. oktober 2004 - 15:47 #5
t1=tid før
t2=tid efter
nbyt=antal bytes læst
limit=max. båndbredde
Avatar billede vandborg Nybegynder
20. oktober 2004 - 15:53 #6
Først, tak for at du hjælper mig :-)

Jo, det kunne godt tænkes at virke. Men bliver bufferens størrelse ikke nødt til at være noget ala maks. båndbredden, for ikke at hente for meget af gangen?

og i denne forbindelse, hvis man nu antager jeg vælger en latterligt lille buffer på f.eks. 50 bytes for at opnå størst præcision ... Vil dette ikke ligeledes spilde båndbrede, da TCP protokollen altid sender en mini pakke for at tjekke om den egentlige pakke blev modtaget? (Er måske på et vildspor her)
Avatar billede arne_v Ekspert
20. oktober 2004 - 16:06 #7
Jo mindre buffer jo mere jævn båndbredde forbrug vil ovenstående give.

TCP pakkernes størrelse påvirkes ikke af din buffer størrelse (der er en buffer
TCP/IP stakken mellem ledningen og din applikation).

Der er selvfølgelig ikke nogen effekt af at sætte buffer størrelsen under
TCP pakke støtrrelsen.
Avatar billede vandborg Nybegynder
20. oktober 2004 - 16:08 #8
Tak for hjælpen, skriv lige et svar, så får du pointene. :-)
Avatar billede arne_v Ekspert
20. oktober 2004 - 16:11 #9
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis