überspringe Navigation

Tag Archives: Netzwerkprogrammierung

Möchte man Netzwerkspiele oder sonstige netzwerk-fähige Anwendungen schreiben, findet man eine ganze Menge guter Bibliotheken für C++ im Internet. Im .NET Bereich ist die Auswahl jedoch nicht gerade groß, dafür gibt es eine ausgezeichnete C#-Bibliothek namens Lidgren, die fast keine Wünsche offen lässt.

Lidgren setzt auf das Netzwerkprotokoll UDP (User Datagram Protocol), baut jedoch auch Charakterisken einer TCP-Verbindung nach, was die Bibliothek sehr flexibel macht. Man kann als Programmierer selber entscheiden wie wichtig die Daten sind, die man versendet und ob die Reihenfolge beim Empfänger genau stimmen muss.

Die Besonderheit des UDP-Protokolls besteht ja darin, dass Pakete verloren gehen können, in einer anderen Reihenfolge ankommen können … und zu allem Überfluss natürlich auch kaputt ankommen können. Alle diese Nachteile haben allerdings den Vorteil, dass diese Übertragungsart sehr schnell ist, denn das UDP-Protokoll muss nicht ständig die Reihenfolge der Pakete überprüfen. Auch werden keine Empfangsbestätigungen verschickt und dann ggf. Pakete mehrmals versendet.

Lidgren vereint die Stärken von UDP und TCP. Jede Nachricht, die man versendet, bekommt einen Kanal zugewiesen, der den Nachrichtentyp festlegt. Folgende Kanäle sind möglich:

  • „Unreliable unordered“ – Reihenfolge der Nachrichten ist unbestimmt; Nachrichten können verloren gehen.
  • „Reliable unordered“ – Alle Nachrichten kommen an; Reihenfolge ist unbestimmt
  • „Sequenced“ – Nachrichten können verloren gehen; Reihenfolge wird eingehalten
  • „Ordered“ – Alle Nachrichten kommen in der vorgesehenen Reihenfolge an (früher oder später)

Die Netzwerkbibliothek beherrscht darüber hinaus noch weitere Funktionen wie das kontrollierte Drosseln des Netzwerktransfers (Bandwidth Throttling), Verschlüsselung und die Zeitsynchronisation. Auch sehr interessant ist, dass man – speziell zum Testen – einen künstlichen Lag oder eine Wahrscheinlichkeit für verloren gehende Pakete definieren kann.