Ich hatte vorher noch nie UDP benutzt, also habe ich es versucht. Um zu sehen, was passieren würde, ließ ich den 'Server' jede halbe Sekunde Daten senden und der Client erhielt alle 3 Sekunden Daten. Obwohl der Server Daten viel schneller sendet, als der Client empfangen kann, empfängt der Client die Daten dennoch einzeln nacheinander.
Kann jemand erklären, warum / wie das passiert? Wo sind die Daten genau gepuffert?
Senden
%Vor%Alle CSomeObjServer-Funktionen erhöhen jede halbe Sekunde eine ganze Zahl um
Empfangen
%Vor%CSomeObjClient speichert die Variable und hat eine Funktion (alterSomeVar), um sie zu aktualisieren
Ausgabe:
%Vor% Der Betriebssystemkernel verwaltet separate Sende- und Empfangspuffer für jeden UDP- und TCP-Socket. Wenn Sie google SO_SNDBUF
und SO_RCVBUF
aufrufen, finden Sie viele Informationen über sie.
Wenn Sie Daten senden, wird sie von Ihrem Anwendungsbereich in den Sendepuffer kopiert. Von dort wird es auf die Netzwerkkarte und dann auf die Leitung kopiert. Die Empfangsseite ist umgekehrt: NIC, um Puffer zu empfangen, wo es wartet, bis Sie es lesen. Zusätzlich können je nach Betriebssystem auch Kopien und Pufferung auftreten.
Es ist wichtig zu beachten, dass die Größe dieser Puffer radikal variieren kann. Einige Systeme haben einen Standardwert von 4 Kilobyte, andere nur 2 Megabyte. Sie können die aktuelle Größe mit getsockopt()
mit SO_SNDBUF
oder SO_RCVBUF
ermitteln und ebenfalls mit setsockopt()
festlegen. Aber viele Systeme begrenzen die Größe des Puffers manchmal auf beliebig kleine Beträge. Dies ist normalerweise ein Kernel-Wert wie net.core.wmem_max
oder net.core.rmem_max
, aber die genaue Referenz variiert je nach System.
Beachten Sie auch, dass setsockopt()
fehlschlagen kann, auch wenn Sie einen geringeren Betrag als das angenommene Limit anfordern. Um also tatsächlich eine gewünschte Größe zu erhalten, müssen Sie setsockopt()
wiederholt mit abnehmenden Beträgen aufrufen, bis es schließlich erfolgreich ist.
Die folgende Seite ist eine Tech Note von meiner Firma, die ein wenig auf dieses Thema eingeht und Referenzen für einige gebräuchliche Systeme liefert: Ссылка
Es sieht für mich so aus, als würde die UdpClient-Klasse einen Puffer für empfangene Daten bereitstellen. Versuchen Sie es direkt mit einem Socket. Möglicherweise möchten Sie auch die Sockets ReceiveBufferSize auf Null setzen, obwohl ich glaube, dass sie nur für TCP-Verbindungen verwendet wird.