Ik ben bezig om een UDP server/client te maken in C# en loop tegen het probleem aan dat het moeilijk is de maximale snelheid te halen. Hier een stukje code die het probleem beschrijft:
Voor de leesbaarheid heb ik bepaalde gedeeltes en exceptions weggehaald.
De code hierboven zal niet goed werken, omdat zo snel mogelijk packets worden verzonden: de buffer van de router zal vollopen en bijna alle packets worden gedropt. Als ik de Thread.Sleep(1) uitcomment, zal dit probleem niet optreden, maar is de throughput maximaal 1MB/s (wat niet genoeg is).
Ik zoek dus een elegantere oplossing voor dit probleem, wellicht met een variable sleep die < 1ms aankan. TimeSpan ticks gebruiken werkt helaas niet, omdat je daarmee ook niet < 1ms kan sleepen. Het liefst wil ik niet p/invoke gebruiken om daarmee usleep() van de win32 api te gebruiken.
Iemand een ideetje?
C#:
1
2
3
4
5
6
7
8
9
10
| int maxlength = 2050; byte[] data = new byte[maxlength]; // Data om te verzenden IPEndPoint sender = new IPEndPoint("192.168.0.1", 10000); // IP/port om naar toe te zenden EndPoint Remote = (EndPoint)(sender); while(true) { newsock.SendTo(data, 0, data.Length, SocketFlags.None, Remote); // Thread.Sleep(1); } |
Voor de leesbaarheid heb ik bepaalde gedeeltes en exceptions weggehaald.
De code hierboven zal niet goed werken, omdat zo snel mogelijk packets worden verzonden: de buffer van de router zal vollopen en bijna alle packets worden gedropt. Als ik de Thread.Sleep(1) uitcomment, zal dit probleem niet optreden, maar is de throughput maximaal 1MB/s (wat niet genoeg is).
Ik zoek dus een elegantere oplossing voor dit probleem, wellicht met een variable sleep die < 1ms aankan. TimeSpan ticks gebruiken werkt helaas niet, omdat je daarmee ook niet < 1ms kan sleepen. Het liefst wil ik niet p/invoke gebruiken om daarmee usleep() van de win32 api te gebruiken.
Iemand een ideetje?
À vaincre sans péril, on triomphe sans gloire - Pierre Corneille