Wie lange dauert ein UDP-Paket Aufenthalt an einer Steckdose?
Wenn Daten an den client gesendet, der client aber beschäftigt ist die Ausführung etwas anderes, wie lange die Daten verfügbar sein, zu Lesen, mit recvfrom()?
Auch, was passiert, wenn ein zweites Paket gesendet wird, bevor die erste gelesen wird, ist das erste verloren und die nächste dort zu sitzen, eine gute Wahl zu Lesen?
(windows - udp)
- Sobald die Daten tatsächlich erreicht die Ziel-Maschine, ich würde davon ausgehen, es ist wahrscheinlich ähnlich behandelt, um TCP-Verkehr – Datagramm sitzen in einem Puffer irgendwo, in der Reihenfolge, in der Datagramme kam, bis es zu Lesen. (Der Puffer voll ist, kann dazu führen, die OS-das Paket droppen insgesamt aber.)
- Wenn Sie sind besorgt über packet loss und, um, warum tun Sie UDP verwenden? Wenn Sie sich derartigen Fragen ist ein sehr starkes Indiz dafür, die Sie tun sollten, TCP
- Warum nicht TCP verwenden, da einige Protokolle wie z.B. DNS, erfordern UDP Unterstützung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Normalerweise werden die Daten gepuffert werden, bis es zu Lesen. Ich nehme an, wenn Sie lange genug warten, dass der Fahrer vollständig läuft out of space, es werde zu tun haben etwas, aber vorausgesetzt, dein code funktioniert nur halbwegs, das sollte nicht das problem sein.
Einem typischen Netzwerk-Treiber werden in der Lage sein Puffer eine Anzahl von Paketen ohne Datenverlust.
Für immer, oder gar nicht, oder bis Sie in der Nähe der Steckdose oder dem Lesen so viel wie ein einzelnes byte.
Der Grund dafür ist, dass:
UDP liefert Datagramme, oder es nicht. Das klingt wie Unsinn, aber es ist genau das, was es ist.
Einem einzelnen UDP-Datagramms bezieht sich auf entweder genau einen oder mehrere "Fragmente", die IP-Pakete (weitere gekapselt in einigen "auf den Draht" - Protokoll, aber das spielt keine Rolle). Der Netzwerk-stack sammelt alle Fragmente, die für ein Datagramm. Wenn die Prüfsumme auf einem der Fragmente ist nicht gut, oder eine andere Sache, die macht der Netzwerk-stack unglücklich, die komplette Datagramm wird verworfen, und Sie bekommen nichts, nichtmal eine Fehlermeldung. Sie wissen einfach nicht, nichts passiert.
Wenn alles gut geht, eine komplette Datagramm in den Empfangspuffer. Nichts weniger und nichts mehr. Wenn Sie versuchen, um
recvfrom
später, das ist, was Sie erhalten.Den Empfangspuffer ist natürlich unbedingt groß genug ist, um mindestens eine max-Größe Datagramm (65535 bytes), aber da in der Regel Datagramme werden nicht die maximale Größe, sondern eher etwas unterhalb von 1280 bytes (oder 1500, wenn man so will), es können in der Regel halten nicht wenige von Ihnen (auf den meisten Plattformen, der Puffer ist standardmäßig irgendwas um die 128-256 Kb, und ist konfigurierbar).
Wenn es nicht genug Platz im Puffer, so wird das Datagramm verworfen, und Sie erhalten nichts (gut, Sie tun noch bekommen diejenigen, die bereits in den Puffer). Wieder, Sie wissen gar nicht, was Los war.
Jedes mal, wenn Sie anrufen
recvfrom
eine komplette Datagramm entfernt wird aus dem Puffer (wichtiges detail!), und Sie bekommen bis auf die Anzahl der bytes, die Sie angefordert. Das bedeutet, wenn Sie naiv versuchen, ein paar bytes und dann ein paar bytes weiter, es will einfach nicht funktionieren. Die ersten Daten gelesen werden, verwerfen Sie den rest des Diagramms, und dem nachfolgenden Lesen der ersten bytes der Zukunft-Datagramme (und eventuell block)!Dies ist sehr unterschiedliche aus, wie TCP funktioniert. Hier können Sie eigentlich Lesen von ein paar bytes und ein paar bytes wieder, und es wird nur funktionieren, weil die Netzwerk-Schicht simuliert eine data stream. Sie geben ein Mist wie es funktioniert, da der Netzwerk-stack stellt sicher, dass es funktioniert.
Du wohl gemeint, zu sagen, "erhalten" anstatt "gesendet". Senden und empfangen haben verschiedene Puffer, so würde überhaupt keine Rolle. Über die Auszeichnung mit einem weiteren Paket, während man noch in den Puffer, siehe oben die Erklärung. Wenn der Puffer zu halten, kann die zweite Datagramm, wird Sie es speichern, sonst ist es still geht * Puh *.
Dies wirkt sich nicht auf Daten die bereits im Puffer sind.
Dies hängt vom OS, windows, ich glaube der Standard für jedes UDP-socket ist 8012, diese können erhoben werden bei setsockopt() Winsock-Dokumentation So, solange der Puffer nicht voll ist, die Daten bleiben dort, bis der socket geschlossen ist oder es wird gelesen.
Wenn der Puffer hat Platz, Sie sind beide gespeichert, wenn nicht, einer von Ihnen wird verworfen. Ich glaube, es ist die neueste, aber ich bin mir nicht 100% Sicher.
recvfrom
erhält alle Daten aus allen Quellen.