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.

  • TTL des eingehenden UDP-Pakets in Python erhalten
  • Broadcasting und Empfangen von Daten mit Python
  • Senden von Datei über UDP in Fragmente unterteilt
  • TCP vs. UDP-Socket-Latenz-Benchmark
  • Was ist der zweite Teil der Adresse, die von recvfrom zurückgegeben wird?
  • Verwenden eines Sockels im UDP-Chat mit Threading
  • UDP-Steckdose Multicast
  • Nicht erreichbare IP-Socket Schließen Sie die Zeit in Windows OS
  • In python, wie bekommt man einen UDPServer zum Herunterfahren selbst?
  • Python-Binde-Fehler bei Multicast-Bindung an Windows
  • Was ist der beste Weg, um Bit Field Manipulation in Python zu tun?
  • Python ist die beste Programmiersprache der Welt.