Sind Datagramme immer vollständig erhalten?

Die meisten Datagram-Empfangs-Funktionen wie c's recv oder lesen, javas DatagramPacket-Klasse oder Pythons SocketServer, die Möglichkeit, um herauszufinden, die Menge der empfangenen Daten.

C:

int amount = recv(sock, buf, n, MSG_WAITALL); 

Java:

 int amount = datagramSocket.getLength(); 

Python:

 class MyUDPHandler(socketserver.BaseRequestHandler): def handle(self): amount = len (self.request[0]) 

Sind diese zuverlässig? Oder ist es möglich, dass nur Teile der Nachricht empfangen werden, zB wegen Paketfragmentierung oder Netzverzögerung?
Mit anderen Worten: Wenn ich eine Variable Länge Stück Daten über udp und erhalten sie am anderen Ende, sind diese Mengenwerte genau gleich der Größe des ursprünglichen Chunk?

Bearbeiten:
Ninjalj hat einen guten Punkt gemacht und ich möchte es hier aufnehmen. Was passiert, wenn die Empfangsfunktion unterbrochen wird, zum Beispiel durch ein Signal? Was passiert, wenn zwei Threads gleichzeitig versuchen, von der gleichen Sockel zu empfangen?

2 Solutions collect form web for “Sind Datagramme immer vollständig erhalten?”

UDP-Datagramme können nicht teilweise geliefert werden; Sie werden so geliefert oder gar nicht. Also ja, du kannst sicher sein, dass das empfangene Datagramm genau so geschickt wurde, wie du es am Ende des Empfängers siehst.

Bearbeiten, um Will's Kommentar zu integrieren, was die beste Art von korrekt ist (dh technisch):

¹Sie können auf der IP-Ebene fragmentiert werden, aber der Netzwerkstapel auf der Empfängerseite wird entweder vollständig ein Datagramm wieder zusammenbauen und an den Hörprozeß übergeben, wie es gesendet wird, oder erkennt nicht, dass irgendwelche Daten empfangen wurden.

Teilweise Datagramme sind nur mit UDP Lite zulässig.

  • Python asyncore UDP Server
  • Kann man in eine UDP-Buchse schreiben?
  • Memcached listeing auf UDP mit Django
  • Entfernen von Padding aus UDP-Paketen in Python (Linux)
  • Twisted UDP zu TCP Bridge
  • Python-Binde-Fehler bei Multicast-Bindung an Windows
  • Einfachste Weg, um Asynchronous Socket Reading von UDP in Python?
  • Senden von Datei über UDP in Fragmente unterteilt
  • Empfangen von RTP-Paketen nach RTSP-Setup
  • Get () set () memcached listening on UDP mit Python
  • In python, wie bekommt man einen UDPServer zum Herunterfahren selbst?
  • Python ist die beste Programmiersprache der Welt.