Du bist nicht angemeldet.

Werbeanzeige

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 140

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

1

13.07.2012, 10:38

UDP Netzwerke im Internet

Hallo Leute,

für mein Bomberman-klon Projekt plane ich eine Umsetzung zur Aufsetzung eines Servers im Internet. Prinzipiell wird dort ein Programm laufen, welches auf Anfrage hin ein Spiel eröffnet. Spannend ist dabei, wie man bei der Netzwerkommunikation umgeht: Wird für jedes Spiel (bei dem Maximal vier Clients angemeldet sind), eine eigene UDP-Verbindung auf oder läuft das alles über den Server selbst über eine Verbindung, der direkt an die Spiele delegiert? Ich vermute mal, dass nicht mehr als ein paar Spiele (5-10) laufen werden.

Habt ihr sonst noch Hinweise, die ich bei der Entwicklung beachten sollte (besonder vllt was Sicherheit angeht).

Danke schonmal!

David Scherfgen

Administrator

Beiträge: 10 277

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

13.07.2012, 11:04

Ich verstehe deine Frage nicht ganz.
Der Server muss eine Verbindung zu jedem Client haben. Die Clients untereinander haben normalerweise keine Verbindung.
Gedanken machen solltest du dir darüber, wie du mit verlorenen, beschädigten oder in falscher Reihenfolge ankommenden Datenpaketen umgehst, denn dies kommt bei UDP vor.
Außerdem musst du mit der Latenz umgehen können, d.h. Pakete können z.B. 100 ms benötigen um zwischen Server und Client ausgetauscht zu werden. Idealerweise berechnet der Client schon vorher die Auswirkungen der Aktionen des Spielers (Client-side prediction), da ein hohes Delay den Spieler sonst stark benachteiligen und zu einer sehr schwammigen Steuerung führen würde. Natürlich muss der Client sich vom Server "korrigieren" lassen, wenn die Client-side prediction auf Grund einer anderen/veralteten Sicht auf die Spielsituation falsch lag.
Das ist sowieso ein generelles Problem: jeder Spieler hat eine andere Sicht auf das Spiel, da die Informationen immer bereits veraltet sind, wenn sie ankommen. Das führt dann zu Situationen, die man nicht lösen kann, ohne einen Spieler zu benachteiligen. Bekannt ist sowas z.B. von Counter Strike, wo jemand noch getroffen wird, obwohl er aus seiner Sicht bereits um eine Ecke in Sicherheit gelaufen ist. Aus der Sicht des anderen war er jedoch noch sichtbar und zu treffen ...

Databyte

Alter Hase

Beiträge: 1 044

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

3

13.07.2012, 11:09

So wie ich das verstehe möchtest du nur einen Server, der zwischen den Clienten ein Peer-to-peer netzwerk erstellt ? weil sonst lohnt sich UDP eigentlich nicht so richtig. mit einem Server in der Mitte solltetest du TCP benutzten. Bei einem Peer-to-peer netzwerk soll es auch mit tcp gehen (hab ich mal irgendwo gelesen). Ich glaube raknet kann sowas, also mit mehreren clienten.

Nox

Supermoderator

Beiträge: 5 284

Beruf: Student

  • Private Nachricht senden

4

13.07.2012, 11:19

Bist du dir denn darüber im klaren, ob du eher ein Lobbyserver haben willst, der von Spieler gehostete Server auflistet oder willst du die Spielinstanzen zusammen mit dem Lobbyserver laufen lassen? In beiden Fällen kann es eigentlich nicht schaden, wenn pro Spielinstanz auch ein zufälliger Port geöffnet wird (gibt ja genug): man erspart sich das Zuordnen der Pakete zu den Spielinstanzen, hat eine klarere Trennung und man kann so eine Spielinstanz dann auch einfach auf einem anderen Rechner laufen lassen, aber man hat natürlich den "Nachteil", dass man den Netzwerkteil dann mehrfach laufen lässt, was aber je nach Implementierung kaum ins Gewicht fällt.

P.S: Der P2P Gedanke ist prinzipiell Protokoll unabhängig, aber mit UDP ist ein punchthrough durch NATs möglich, weshalb es für P2P klare Vorteile zeigt. UDP ist wunderbar geeignet, wenn einem Paketverluste egal sind, was z.B. bei A-Man in sehr guter Näherung gegeben ist, wenn man einfach den gesamten Zustand immer rüberschickt (komprimiert nat.) oder wie in UT mit "delta-states/state-changes" rangeht.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 140

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

13.07.2012, 12:25

@David:
Ich hätte vielleicht erwähnen sollen, dass ich bereits eine Lösung im LAN habe. Das basiert auf einer Client-Server Architektur auf Basis von UDP. Dabei erhält der GameServer als einziges die Eingaben von den Clients. Der Server sendet regelmäßig einen kompletten Game-Snapshot an alle Clients. Diese interpretieren diesen an Hand von einem Servertimestamp und versuchen, möglichst gut, das in der zwischenzeit vergangene "vorherzusagen" - deine angesprochene Client-Side prediction. Das klappt bisher auch ziemlich gut. Die Clientseitige Inter- und Extrapolation ist definitiv ausbaufähig, aber es gibt einen zumindest bisher im LAN akzeptablen algorithmus. Die Logik wird komplett auf dem Server berechnet. Und da der gesamte Zustand komplett gesendet wird, muss ich mich um verlorene Pakete wenig kümmern.

@Nox:

Zitat

Bist du dir denn darüber im klaren, ob du eher ein Lobbyserver haben willst, der von Spieler gehostete Server auflistet oder willst du die Spielinstanzen zusammen mit dem Lobbyserver laufen lassen?
Eher letzeres. Quasi fehlt mir der Lobby-Server, den Spielinstanz-Server gibt es schon. Der läuft halt bisher in dem Prozess des Clients, der das Spiel eröffnet - was für ein lokales Netz durchaus vertretbar ist. Da wären dann einige Umbauten Notwendig. Die Idee mit den Ports gefällt mir ziemlich gut. Das spricht ja wohl dafür, dass jede Spielinstanz eine eigene Verbindung aufmacht?! Und das war auch eigentlich meine Frage :)

Werbeanzeige