4 Stimmen

"Richtige" Art und Weise, eine Folge von UDP-Datagrammen zu senden?

Ich hatte den Eindruck, dass die Instabilität von UDP eine Eigenschaft der physikalischen Schicht ist, aber das scheint nicht der Fall zu sein:

Ich versuche, eine Nachricht über UDP zu senden, die in eine Folge von Paketen aufgeteilt ist. Die Identifizierung und Neuordnung der Nachricht erfolgt implizit.

Ich habe diese Methode mit zwei Anwendungen getestet, die auf demselben Computer laufen, und hatte erwartet, dass sie reibungslos funktioniert. Doch obwohl die Datenübertragung zwischen zwei Programmen auf demselben Computer stattfand, kam es zu Paketverlusten, und zwar recht häufig. Die Verluste scheinen auch ziemlich zufällig zu sein: Manchmal kam die gesamte Nachricht durch, manchmal nicht.

Nun, die Tatsache, dass die Verluste sogar auf demselben Rechner auftreten, lässt mich fragen, ob ich es richtig mache?

Ursprünglich habe ich alle Teile der Nachricht asynchron in einem einzigen Schritt gesendet, ohne auf die Fertigstellung eines Teils zu warten, bevor ich den nächsten sende.

Dann habe ich versucht, den nächsten Teil der Nachricht innerhalb der Abschlussroutine der vorherigen Nachricht zu senden. Das verbesserte zwar die Paketverlustquote, konnte sie aber nicht ganz verhindern.

Wenn ich eine Pause (Sleep(...)) zwischen den Stücken einfüge, funktioniert es zu 100%.

EDIT : Wie in den Antworten angedeutet: Die Pakete werden einfach zu schnell gesendet, und das Betriebssystem puffert nur minimal. Das ist logisch.

Was sollte ich also tun, wenn ich verhindern möchte, dass dem System eine Quittung und eine erneute Übertragung hinzugefügt wird (ich könnte dann einfach TCP verwenden)? Wie kann ich die Paketverlustrate am besten verbessern, ohne dass die Datenrate auf ein Niveau sinkt, das höher hätte sein können?

EDIT 2: Es kam mir in den Sinn, dass das Problem vielleicht nicht genau Puffer-Überfüllung, sondern Puffer-Verfügbarkeit ist. Ich verwende async WSARecvFrom zum Empfangen, das einen Puffer verwendet, der, wie ich verstanden habe, den Standardpuffer des Betriebssystems außer Kraft setzt. Wenn ein Datagramm empfangen wird, wird es in den Puffer eingespeist, und die Abschlussroutine wird aufgerufen, ob der Puffer voll ist oder nicht.

Zu diesem Zeitpunkt gibt es keinen Puffer mehr, um eingehende Daten zu verarbeiten, bis WSARecvFrom innerhalb der Abschlussroutine erneut aufgerufen wird.

Die Frage ist, ob es eine Möglichkeit gibt, eine Art von Puffer-Pool zu erstellen, so dass Daten gepuffert werden könnten, während ein anderer Puffer verarbeitet wird?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X