Avatar billede ulrik Nybegynder
23. december 2004 - 11:02 Der er 7 kommentarer og
1 løsning

Overførsel hastighed

Hej,

Jeg foretager en overførsel, ved først at loade dataene ind i en buffer, hvorefter de skrives til en fil eller en klient.

while( byteRead != 0 && status == STATUS.ONLINE )
{
    byte[] buffer = new Byte[128];
    byteRead = reader.Read( buffer, 0, buffer.Length );
    stream.Write( buffer, 0, byteRead );
}

Problemet er at jeg gerne vil styre hastigheden, som dataene bliver sendt (upload) eller modtaget (downloaded) fra klienten ( eks. 7 kb/sec ).

Er der nogen der har en løsning til dette, eller et hint til hvorledes dette kan løses.
Avatar billede arne_v Ekspert
23. december 2004 - 11:23 #1
Efter hver Read beregner du forskellen på Now og sidste Read's Now, og sammenholder
med bytes read og hvis det er for stort så laver du en Sleep som bringer dig ned
på den ønskede hastighed.
Avatar billede arne_v Ekspert
23. december 2004 - 11:28 #2
t1 = 0;
while( byteRead != 0 && status == STATUS.ONLINE )
{
    byte[] buffer = new Byte[128];
    byteRead = reader.Read( buffer, 0, buffer.Length );
    t2 = DateTime.Now.Ticks;
    if(bytesRead/(t2-t1) > limit)
    {
        Thread.Sleep(bytes/limit + t1 - t2);
    }
    stream.Write( buffer, 0, byteRead );
}

Du må lige selv få styr på 1/1000000 sekunder, 1/1000 sekunder, hvad du måler
limit i etc..
Avatar billede arne_v Ekspert
23. december 2004 - 11:29 #3
Hov t1 skal naturligvis sættes til t2:

t1 = 0;
while( byteRead != 0 && status == STATUS.ONLINE )
{
    byte[] buffer = new Byte[128];
    byteRead = reader.Read( buffer, 0, buffer.Length );
    t2 = DateTime.Now.Ticks;
    if(bytesRead/(t2-t1) > limit)
    {
        Thread.Sleep(bytes/limit + t1 - t2);
    }
    t1 = t2;
    stream.Write( buffer, 0, byteRead );
}
Avatar billede ulrik Nybegynder
23. december 2004 - 19:24 #4
Hej igen tak for det hurtige svar, har prøvet noget lignende, men synes ikke det giver et præcist resultat. Har forresten sat bufferen op til 4096, da det andet var alt for lidt. Har prøvet to ting:

1)
int limit = 1024 * 10;

Thread.Sleep( (int) ( 1000 * ( (double) byteRead / limit ) ) );

Her giver det præcise resultat op til 150 ca. så begynder det at afvige.

- 150 = 152
- 200 = 195
- 1000 = 809-819


2)
nTime = DateTime.Now.Ticks;
if( wTime != 0 )
{
    double t = 1000 - ( ( nTime - wTime ) / (double) 10000 );
    Thread.Sleep( (int) ( ( t < 0 ? 0 : t ) * ( (double) byteRead / limit ) ) );
}
wTime = nTime;

Samme problem, viser 4-5 for meget ved 0-200, herefter begynder det også at varriere meget.
Avatar billede arne_v Ekspert
25. december 2004 - 18:54 #5
Den her SlowServer:

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

public class SlowServer
{
    private const int SIZE = 1000000;
    private const double SPEED = 10000;
    private const string LINE = "123456789012345678";
    private const int CHUNK = 100;
    public static void Main(string[] args)
    {
        TcpListener server = new TcpListener(IPAddress.Any, 80);
        server.Start();
        while(true)
        {
            try
            {
                TcpClient client = server.AcceptTcpClient();
                StreamReader rdr = new StreamReader(client.GetStream());
                StreamWriter wrt = new StreamWriter(client.GetStream());
                string line;
                while((line = rdr.ReadLine()) != "")
                {
                    Console.WriteLine(line);
                }
                wrt.WriteLine("HTTP/1.0 200 OK");
                wrt.WriteLine("Content-Length: " + SIZE);
                wrt.WriteLine("Content-Type: text/plain");
                wrt.WriteLine("Content-Disposition: attachment; filename=\"test.txt\"");
                wrt.WriteLine();
                wrt.Flush();
                int bytes = CHUNK * (LINE.Length + 2);
                for(int i = 0; i < SIZE / bytes; i++)
                {
                    long t1 = DateTime.Now.Ticks;
                    for(int j = 0; j < CHUNK; j++)
                    {
                        wrt.WriteLine(LINE);
                    }
                    long t2 = DateTime.Now.Ticks;
                    double secs = (t2 - t1) / 10000000.0;
                    if(bytes / secs > SPEED)
                    {
                        double wait = bytes / SPEED - secs;
                        Thread.Sleep((int)(1000 * wait));
                    }
                    wrt.Flush();
                }
                rdr.Close();
                wrt.Close();
                client.Close();
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }
        }
        server.Stop();
    }
}

starter også lidt højt men stabiliserer sig hurtigt på de korrekte 9.76 KB/s
(10000 / 1024).
Avatar billede arne_v Ekspert
01. januar 2005 - 12:49 #6
OK ?
Avatar billede arne_v Ekspert
22. januar 2005 - 23:02 #7
??
Avatar billede ulrik Nybegynder
07. februar 2005 - 16:55 #8
Undskyld, havde glemt spørgsmålet. Har løst problemet. Problemet var at når den skal sove i meget kort tid, vil den ofte sove i længere tid.

Løsningen: Jeg gemte tiden den har sovet for meget, herefter sover den først, når den gemte tid blevet godt gjort.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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