Gå til innhold

Anbefalte innlegg

Hvordan kan jeg ta tiden det tar å overføre en viss mengde data, f.eks. et byte-array.

 

Tenkte jeg kunne lage en networkStream eller en Socket, og ta tiden det tar å sende ut arrayet. Men send() og write() ser ut til å returnere rimelig umiddelbart.

 

Noen forslag? Eller noen som hvet om en ferdiglaget C#-sak?

Lenke til kommentar
Videoannonse
Annonse

DateTime og TimeSpan burde vel kunne brukes her. Er litt usikker på oppløsningen på de, siden du vet at dette går kjapt.

 

Noen sånt:

 

DateTime before = DateTime.Now;

//Nettverkskode

DateTime after = DateTime.Now;

 

TimeSpan ts = after - before;

Endret av Spartakus
Lenke til kommentar

Har ikke prøvd stopwatch, men timespan. Problemet er fremdeles at send() og write() returnerer umiddelbart, slik at det tar 0 millisekund...

 

Uansett, brukte 1 million ping til å bestemme om linken var i orden. Gjennomsnittelig RTT var på rundt 0,05-6 ms før og etter endring i nettet, så da virker det...

Lenke til kommentar

Som sagt, så var problemet at Send() og Write() returnerte umiddelbart, ikke selve tidsmålingen...

 

Uansett, brukte en asynkron sending, med callback når sendingen var ferdig.

 

Det blir omtrent noe sånt...

 

        private void button4_Click(object sender, EventArgs e)
       {
           int numBytes = (int)bytesToSendUpDown.Value;
           Random r = new Random();

           byte[] rxBuffer = new byte[42];
           string host = hostTextBox.Text;
           if (host.Equals(""))
               host = "localhost";
           tc = new TcpClient();
           s = tc.Client;
           tc.Connect(host, 4242);

           s = tc.Client;


           // Set up some data to send
           byte[] buffer = new byte[numBytes];
           r.NextBytes(buffer);
           SocketError se = new SocketError();
           sw.Start(); // Dette er en sånn stopwatch Mannfred liker så godt...
           s.BeginSend(buffer, 0, numBytes, SocketFlags.None, out se, finishedSend, s);                     
       }
       private void finishedSend(IAsyncResult iar)
       {
           Socket s =  (Socket)iar.AsyncState;
           int i = s.EndSend(iar);
           sw.Stop();
           TimeSpan ts = sw.Elapsed;

           s.Close();
           tc.Close();
           // Beregne båndbredde her...

       }

 

Men dette fungerer ikke særlig bra, det tar lengre å lengre tid å kjøre for hver gang jeg tester.

 

Ping har jeg allerede implementert, og det er veldig enkelt å gjøre.

Endret av Mr Burns
Lenke til kommentar
Hvis du bruker den asynkron så kan du jo sette på en event på "Finish" eller noe slikt da. Så hvis du starter StopWatch ved Start(), og så stopper den i funksjonen som håndterer End-eventen, så vil du jo få en måling...

Ja, som du ser i koden er det nettopp det jeg har gjort.

 

Eneste problemet er at hver test tar lengre tid en den forrige, så helt riktig kan det ikke være.

Lenke til kommentar

haha, se der ja!

 

Hmmm, 100000000 byte på 125 millisekund....

 

Socket sin beginSend og endSend returnere også etter å ha gitt bufferne videre til operativsystemet...

 

EDIT: Ved å ta tiden på "serveren", dvs den som mottar data, kan jeg da beregne at vi har en effektiv båndbredde på ca. 480Mb/s...

Endret av Mr Burns
Lenke til kommentar
  • 1 måned senere...
Ble du ferdig med dette programmet?

 

Er det en server del og en kllient del?

 

Kunne godt tenkt meg å se litt nærmere på dette, om du ikke vil gi fra deg kilden, så kanskje du poster en .exe?

 

Ja, jeg fikk til noe som fungerte. Laget ett program som fungerte enten som server eller klient. Jeg /tror/ jeg kan dele koden, må bare sjekke med sjefen først, siden jeg laget det på jobb.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...