Waarschijnlijk een standaard vraag, maar ik heb tot nu toe nergens een gepaste oplossing kunnen vinden...
Ik ben bezig met het maken van een hele usenet newsreader (voor leerdoeleinden), maar bij het leegslurpen van de NetworkStream waarop de data binnen vloeit loop ik tegen een probleem aan. De 42k bytes die gedownload moeten worden, splits ik op in blokken van 1024 bytes. De eerste 41 iteraties voor het downloaden gaan goed, maar bij het laatste blok wordt de buffer niet helemaal gevuld, waardoor NetworkStream.Read blijft wachten op aanvullende data tot de timeout voorbij is (standaard ~60s). Dit is natuurlijk niet acceptabel bij het downloaden van 300 van deze files
met als output:
(minuut verschil tussen de laatste twee blocks)
Wat heb ik al geprobeerd?
- Ik heb via NetworkStream.DataAvailable gecheckt wanneer er geen data beschikbaar meer is, echter zit je hier met het probleem dat de connectie naar de server traag kan zijn en er misschien 300ms over doet om nieuwe data binnen te halen.
- NetworkStream.ReadTimeOut lager instellen, maar ook hier moet je weer rekening houden met tragere verbindingen, waardoor je alsnog een seconde wacht.
Ik neem toch aan dat er een manier is om te stoppen met het ophalen van data zonder met timeouts te gaan werken?
Mijn excuses voor de onduidelijke titel, maar dit was het beste waar ik op kwam
Ik ben bezig met het maken van een hele usenet newsreader (voor leerdoeleinden), maar bij het leegslurpen van de NetworkStream waarop de data binnen vloeit loop ik tegen een probleem aan. De 42k bytes die gedownload moeten worden, splits ik op in blokken van 1024 bytes. De eerste 41 iteraties voor het downloaden gaan goed, maar bij het laatste blok wordt de buffer niet helemaal gevuld, waardoor NetworkStream.Read blijft wachten op aanvullende data tot de timeout voorbij is (standaard ~60s). Dit is natuurlijk niet acceptabel bij het downloaden van 300 van deze files
C#:
1
2
3
4
5
6
7
8
9
10
11
| byte[] buffer = new byte[1024]; int bytesRead; int totalBytesRead = 0; while ((bytesRead = networkStream.Read(buffer, 0, buffer.Length)) > 0) { fileStream.Write(buffer, 0, bytesRead); totalBytesRead += bytesRead; Console.WriteLine("{0} - {1} bytes so far", DateTime.Now.ToString("HH:mm:ss:fff"), totalBytesRead); } |
met als output:
Connection established Login successful 15:48:24:699 - 1024 bytes so far 15:48:24:699 - 1460 bytes so far 15:48:24:700 - 2484 bytes so far [...] 15:48:24:944 - 40880 bytes so far 15:48:24:946 - 41502 bytes so far 15:49:25:602 - 41542 bytes so far Download 005d4a96$0$8186$c3e8da3@news.astraweb.com complete Press any key to continue...
(minuut verschil tussen de laatste twee blocks)
Wat heb ik al geprobeerd?
- Ik heb via NetworkStream.DataAvailable gecheckt wanneer er geen data beschikbaar meer is, echter zit je hier met het probleem dat de connectie naar de server traag kan zijn en er misschien 300ms over doet om nieuwe data binnen te halen.
- NetworkStream.ReadTimeOut lager instellen, maar ook hier moet je weer rekening houden met tragere verbindingen, waardoor je alsnog een seconde wacht.
Ik neem toch aan dat er een manier is om te stoppen met het ophalen van data zonder met timeouts te gaan werken?
Mijn excuses voor de onduidelijke titel, maar dit was het beste waar ik op kwam
Ehhh wat?