Einzelnen Beitrag anzeigen

Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#23

AW: instanz des eigenen Programms im Netzwerk finden?

  Alt 24. Feb 2016, 15:00
UDP hat kein Connect, das ist richtig. Allerdings können, wie auch bei TCP, beide Parteien senden und empfangen.

Kurze Erklärung: TCP macht beim Verbinden einen sogenannten 3-way-handshake. Stell es dir vor wie "Hey Server, bist du da? Ja, bin da. Okay.". Sobald dieser handshake abgeschlossen ist, kannst du dir sicher sein, dass du eine funktionierende Verbindung zwischen Server und Client hast. TCP stellt während der Kommunikation über diesen Kanal dann außerdem sicher, dass
  1. Daten in der korrekten Reihenfolge ankommen (Sequencing)
  2. Daten korrekt ankommen (Checksumming)
  3. du eine Rückmeldung bekommst, dass die Daten ankamen (ACK)

All dies tut UDP nicht. Auch kein Handshake. Für die meisten Anwendungen ist TCP sinnvoller, da es für dich wichtig ist, dass deine Daten richtig ankommen. Aber stell dir einen Videostream vor. Der Aufwand, jedes einzelne Paket (also im Schnitt so 1,5KiB) mit einem ACK zu bestätigen führt zu enormen Latenzen und viel eher unnötigem Traffic. Zusätzlich kann ein Videocodec oft gut damit umgehen, wenn einzelne Bits mal falsch sind oder Pakete in falscher Reihenfolge ankommen. Daher ist UDP für Videostreams oft die bessere Wahl.

Neben solchen Streams gibt es aber auch technische Notwendigkeiten. Darunter Broadcast und Multicast. Wenn du Pakete nicht an einen Server (oder einen Client) sendest, sondern an eine ganze Gruppe von Geräten (Multicast) oder einfach an alle (Broadcast), dann kannst du nicht mit jedem eine Verbindung aufbauen. Also bist du für Broadcast auf UDP beschränkt.

Zur konkreten Umsetzung in Delphi kann ich dir leider nicht helfen, aber über Bei Google suchenindy UDP Broadcast findest du sicherlich einiges an Material.

Im Gegensatz zu Sir Rufus Vorschlag, statt zu suchen, selbst zu schreien, schlage ich aber vor, beides zutun. Deine Programme (ich setze voraus dass die Instanzen identisch sind) sollten auf einem von dir gewählten UDP Port (nimm einen über 1024) lauschen und selbst über einen Timer gelegentlich mal ein "Hier bin ich, wo seid ihr" als Broadcast senden. So sollte jedes Programm auf sich selbst aufmerksam machen und dabei auch die Aufmerksamkeitsgesuche anderer beachten. Damit musst du keine Unterscheidung zwischen Server und Client treffen.

Konnte ich damit alle Klarheiten beseitigen?
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat