Wie macht man am besten eine "Lobby" für Netzwerkspiele mit WinSockets?
-
Ich will ein Spiel von mir netzwerkfähig machen. Ich habe mir dafür WinSockets angeschaut. Nun weiß ich aber nicht, wie ich mein Problem am einfachsten lösen kann. Am meister Kopfzerbrechen bereitet mir folgendes:
Am Beginn eines Netzwerkspiels gibt es ja die Lobby, wo sich andere Computer dem Spiel anschließen können, Einstellungen getroffen werden...
Damit die anderen Computer den Server finden habe ich mir gedacht, ich sende einen Broadcast über einen UDP-Socket. Der Server wartet dann auf die teilnehmenden Computer. Während des Wartens soll das Programm aber normal weiterlaufen um Einstellungen treffen zu können.
Gefunden habe ich die Möglichkeiten:
1. select()-Funktion (blockiert das das Programm?)
2. nicht blockierende Sockets
3. Threads (müsste ich erst lernen, wie das geht, aber das sollte kein Problem sein)Welche Möglichkeit ist die beste(kann auch eine nicht angeführte sein)?
Außerdem weiß ich noch nicht, ob TCP oder UDP für Spiele geeigneter ist.Danke schon im voraus!
-
Wenn du ein Spiel erstellst das über Sockets netzwerkfähig ist solltest du dich auf jeden Fall mit Threads auskennen. Also würde ich dort beginnen, klingt für mich vernünftig.
MfG SideWinder
-
Bei einem Spiel, welches viele Daten sendet und die Geschwindigkeit relevant ist, solltest du UDP verwenden. Handelt es sich aber z.B. um Tic Tac Toe oder Schiffe versenken, dann würde ich bei TCP bleiben, da UDP aufgrund der geringen Datenmenge und der Tolerierbarkeit von Verzögerungen einfach keinen Mehrwert bringt.
-
schon bischen her als ich ein netzwerkspiel gemacht hab.
1. select()-Funktion (blockiert das das Programm?)
glaube nicht. man konnte irgendwie testen auf welchem socket eine nachricht liegt und dann dann nur die mit revc() abholen. so war sichergestellt dass revc() dann nicht blockiert.
http://www.c-worker.ch/tuts/select.php#problem
-
Ich kann dir boost.asio nur empfehlen.
-
Man macht das am besten gar nicht direkt mit Sockets, sondern verwendet eine "höherlevelige" API.
Boost.Asio ist ... "OK", aber auch nicht unbedingt einfach zu verwenden.Einfach wäre z.B. WCF.
-
boost.asio ist ein ziemlicher Quatsch "Tipp". Wie gesagt, dafuer gibt es spezielle APIs. Google hilft.
-
boost.asio kann alles was man benötigt und ist nicht so schwer zu lernen wie WinSockets, noch dazu Plattformunabhängig.
-
Erstmal Danke für die Hilfe!
Threads werde ich definitiv verwenden, damit die Kommunikation mit den Clients nicht die Berechnungen des Servers bremsen. Habe auch noch keine Probleme mit Sockets, also werde ich weiter mit diesen arbeiten.
Noch eine Frage:
Ist es schneller, wenn ich für jeden Client einen neuen Thread mache? Damit könnte dann man ja mit allen Clients gleichzeitig kommunizieren und ich muss sie nicht der Reihe nach behandeln.
Ist es den Aufwand wert, wenn ich etwa 100 Mal pro Sekunde 2 Byte richtung Server und 10 Byte richtung Client schicke (bei bis zu 15 Clients)?
-
Wenn du nur <= 15 Connections hast und dein System sich gut (!) parallelisieren lässt sind Threads vielleicht wirklich eine gute Idee.
http://tangentsoft.net/wskfaq/articles/io-strategies.html ist übrigens eine exzellente Seite für alles Mögliche zum Thema Winsock
Zum Thema select() sei auf Punkt 23 der Lame List verwiesen :p
-
hustbaer schrieb:
Man macht das am besten gar nicht direkt mit Sockets, sondern verwendet eine "höherlevelige" API.
Boost.Asio ist ... "OK", aber auch nicht unbedingt einfach zu verwenden.Einfach wäre z.B. WCF.
Kannst du zufällig irgendwelche anderen High Level Networking Libs empfehlen, die keine Lizensierungskosten haben, auch bei kommerziellem Nutzen?