JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=82d89eb5671a0e301bb35a470d3b50d7Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Probleme mit recv beim Server

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Faller
Junior JLI'ler


Alter: 37
Anmeldedatum: 30.11.2006
Beiträge: 88
Wohnort: Dresden
Medaillen: Keine

BeitragVerfasst am: 31.12.2006, 11:39    Titel: Probleme mit recv beim Server Antworten mit Zitat

ich habe ein simples Server Cleint sistem gebaut.
Wenn ich einfache daten schicke funktioniert es recht gut.
Nun habe ich den Cleint aber in mein Spiel eingebaut und der cleint soll bei jeder bewegung (was fast jeder frame ist) Daten an den Server senden.
Der cleint sendet auch die richtigen Daten ab, aber beim Server kommen mehrer senden Befehle in einem recv an was zum abstürzen des Servers führt.

Ich habe nun hier im Forum nach servern gesucht,und dabei sind folgende Sachen zu tage gekommen erstens ich solte immer senden in jedem frame meines Spieles (was auch zur überlastung führt) und denn eingang "timen" also alles zur selben Zeit machen bei allen Cleints ich suche nun nach Beispielen die sowas schon nutzen tutorials code oder andern hilfen um ein ordentlichen Server zu bauen.

folgende sachen soll mein server beachten
er soll über das internet laufen
es sollen mehrer Cleints möglich seien(ich nutze derzeitig 100)
Ich übergebe derzeitig an den server miene x,y,z Werte (gibt es hier bessere Möglichkeiten)

solte jemand schonmal so ein System gebaut genutzt haben wäre ich wür jede Hilfe dankbar
_________________
versuche alles nur wann und wie ist die frage
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 31.12.2006, 13:00    Titel: Antworten mit Zitat

Das ganze ist ein klein wenig komplexer, fürchte ich.
ich habe selber nicht so richitg viel Ahnung, aber ich sag einfach mal was mir spontan dazu einfällt:

Es ist wichitg, das sowohl der Server, als auch jeder einzelne Client die empfangenen Nachrichten schneller verarbeiten kann, als sei eintreffen.

Man kann natürlcih am Anfang einer Frame alle eingegangenen Nachrichten bearbeiten, aber stell dir einen Server vor, mit 100 Clienten, die alle ca. 60 Frames haben. Kann der Server nur 500 Nachrichten in der Sekunde bearbeiten, mahct er gar nichts mehr, da er in einer endlosschleife ist und nie Daten sendet, sondern alle empfangenen bearbeitet.

Du musst aber alle Nahchrichten so schnell wie möglich bearbeiten, sonst addiert sich das auf und du bearbeitest am Ende 5 Sekunden alte Nachrichten. Die Zeitverschiebung wird imemr größer, kurz das ganze ist unspielbar.

Natürlcih könnte auch der Server mit wenig Clienten das Spiel so oft mit neuen Daten versorgen, dass diese gar nicht mehr dazu kommen ihre Grafiken zu berechnen, wieder das selbe Problem.

D.h. sowohl Server als auch Client muss wohl ab und zu auch eine Bestätigung habne, das alles verarbeitet werden konnte, und dann erst weiter schicken.

Oder du musst ri halbwegs sicher sein, das die sonstigen Berechnungen viel länger dauern, als die Nachrichten zu verarbeiten. D.h. der Server braucht auch ne Framgrenze, und die Spieler dürfen nicht in jedme Frame ihre nachrichten verschicken.


So, dann musst du dir noch überlegen, wie das Spiel laufen soll. Ob es z.b. komplett am Server läuft, und der bekomtm nur die Tastaturcommandos und sendet dann jede Frame den kompleten Spielablauf, oder ob alles von den Clienten berechnet wird.

Du musst mit dem Netzwerktraffic am besten sparsam umgehen, sonst kann obiges leicht passieren oder du hast Lags und wer weiß was sonst noch.

Man kann auch z.b. bestimmte vorhersagen machen, also, von einem Speiler die Position und die Geschwindigkeit übergeben, damit der Client das die nächsten Millisekunden weiterrechnen kann und diese Daten dann nur jede 1/10 Sekunde aktualisieren.

Wie warhscheinlich deutlich geworden ist, ist das ganze nicht so sehr einfach. vor allen Dingen kannd as debuggen sehr schwer werden, wenn z.b. mehr Nachrichten eintreffen als verarbeitete werden können.
Ohne ein gescheites Konzept, ist es dann fast unmöglich irgendwelche Fehelr da zu finden, also sollte man damit anfangen.

Wie gesagt, so super viel Erfahrung hab ich damit nicht, trotzdem müsste das mehr oder weniger stimmen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 31.12.2006, 13:07    Titel: Antworten mit Zitat

Faller hat Folgendes geschrieben:

Der cleint sendet auch die richtigen Daten ab, aber beim Server kommen mehrer senden Befehle in einem recv an was zum abstürzen des Servers führt.

Welches Protokoll verwendest du`? UDP/IP oder TCP/IP?
Versuch mal den Teil zu beschreiben der für die Verarbeitung verantwortlich ist (am besten mit Code) sonst wird dir das pauschal keiner sagen können.
Solltest du mit Threads arbeiten könnte der Fehler auch daher kommen. Bei TCP/IP solltest du keine Probleme bekommen wenn du mit 'select' arbeitest. Bei UDP (was für Positinsangaben am sinnvollsten sein dürfte) kommen die Datenpaktete so an wie sie gesendet werden (abgesehen von der Reihefolge, bzw. gar nicht) allerdings sollten sie nicht zu groß sein da sie sonst eventuell nicht verarbeitet werden (bsp. alter Router).

Aufbauen würde ich ein Paket in etwa so:
[1 Byte Befehle/Aktion] [1 Byte SpielerID]

darauf aufbauend können dann noch Daten angehangen werden. Z.B. Bewegung:
[4 Byte x Pos] [4 Byte y Pos] [4 Byte z Pos] [4 Byte x Richtung] [4 Byte y Richtung] [4 Byte z Richtung] [8 Byte Timecode]

-> 34 Byes gesammt bei Bewegung.

Eventuell wäre es besser wenn du nicht jedes Frame die Position sendest sondern nur einmal pro Sekunde. Bei Richtungsänderung könntest du ein Paket mit obigen Aufbau senden. Daraus kann dann jeder Client die weiteren Positionen selbst berechnen. Die Geschwindigkeit kannst du ja in den Richtungsvektor einbauen (Einheitsvektor in die entsprechende Richtung * Geschwindigkeit pro Einheit)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 31.12.2006, 13:30    Titel: Antworten mit Zitat

Ich warmit meinem letzten Post mal wieder zu langsam Very Happy

Jonathan hat es eigentlich auf den Punkt gebracht.

Folgendes kannst du ja in deine Überlegungen mit einbeziehen ob du mehr auf dem Server oder auf dem Client arbeitst:

Berechnungen überwiegend auf dem Server:
Vorteile
---------
- Geringe Angriffsmöglichkeit für Hacker
- Das Spiel läuft mit großer Sicherheit einheitlich
- Alle Clients werden entlastet

Nachteile
----------
- Hoher Traffic
- Leistungsstarker Server erforderlich

Berechnung überwiegend auf dem Client:
Vorteile
---------
- Geringer Traffic
- Der Server muss nicht so leistungsstark sein
- Die Genauigkeit der Berechnungen kann von CLient abhängig gemacht werden

Nachteile
-----------
- Hacker haben viele Möglichkeiten falsche Daten an den Server zu schicken
- Das Spiel muss aufwändig synchronisiert werden


Natürlich ist das nicht alles und der Vorteil des einen Verfahrens ist der Nachteil des anderen. Aber es sollte wohl reichen um sich Gedanken darüber zu machen was für das eigene Spiel das Beste ist.

Pauschal kann man eh nichts sagen da es vom Spielprinziep abhängig ist was am besten geeignet ist.

Bei schnellen Spielen würde ich Positionsdaten (die verloren gehen können) per UDP senden und die wichtigen Daten (die ankommen müssen) per TCP senden.

Genauso würde ich Positinsberechnungen auf dem Client vornehmen und Schadenspunkte vom Server berechnen lassen.

Aber das ist jetzt mehr an einen Shooter orientiert, bei einem anderen Spielkonzept wäre das unter umständen Schwachsinnig.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 31.12.2006, 13:41    Titel: Antworten mit Zitat

Jop, ich würde eine Mischung empfehlen: Das alelrmeiste wird am Cleintenberechnet, aber in einigen Abständne, z.b. 1 Skeunde schick der Server alle seine Spieldaten, so dass rundungs oder Berechnungsungenauigketien am Clienten wieder glattgebügelt werden.
Wenn man so etwas nicht macht, sondern alles am Clienten berechnet, kanns im schlimmsten Fall zum völligen Synchronisationsverlsut kommen.
Am besten wäre es, dass alles am Server läuft und jede Frame an alle Spieler geschickt wird, aber das wird man sich im seltesten Fall leisten können.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Faller
Junior JLI'ler


Alter: 37
Anmeldedatum: 30.11.2006
Beiträge: 88
Wohnort: Dresden
Medaillen: Keine

BeitragVerfasst am: 31.12.2006, 15:39    Titel: Antworten mit Zitat

danke erstma weis ich jetze das es so net funst wie ich mir das gedacht habe Sad
das spiel was ich versuche zu programmiren soll ein Online Rollenspiel mal werden (natürlich kanz einfach).
Mein derzeitiges Server funktioniert auf www.c-worker.ch deisem Tutorial ich würde gerne das mein neuer Server System das ich mir schreiben möchte aller einer halben Sekunde die Positionen und den Zustand des Spielers übergibt. Der Server solte dann diese neuen Daten an die anderen weitergeben.
Da das so komplex ist wolte ich fragen ob jemand schonmal so eine System gebaut hat. Wenn ja wäre es bestimmt interresant dazu mal ein Tutorial zu bekommen. Oder wenn möglich man sich das desen Projekt mal anzuschauen.
Was wür andere Möglichkeiten gibt es denn daten über das internet zu versenden.

da das warscheinlich der letzte post wird hier drinne allen ein gutes neues Jahr und noch schöne Feiertage
_________________
versuche alles nur wann und wie ist die frage
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 31.12.2006, 16:11    Titel: Antworten mit Zitat

Wo ist dein Problem? Wenn du alle Tuts von der Seite gelesen hast solltest du doch alles wissen was du brauchst.

Ist es denn wirklich notwendig genau jede halbe Sekunde die Daten zu verschicken? Eigentlich musst du das ja nur machen wenn sich etwas ändert. Da du ein RPG machen willst kannst du dir sogar den Luxus leisten und TCP/IP verwenden. Da alles per Klick und Werteberechnung funktioniert sind 100%ige Positionsangabe nicht notwendig Wink

Schau dir mal das Beispiel über 'select' an. Da steht genau erklärt wie man mit mehreren Verbindungen arbeiten kann.

Die Daten würde ich nach dem Prinziep verschicken { Befehl/Aktion, IdSpieler , für den Befehl notwendige Daten}

Die Pakete kannst du dann recht gut aufbauen, denn du weißt welche Daten bei welchem Befehl gesendet werden (also menge und Reihenfolge). Solltest du jetzt nicht wissen wie du die in ein char Array rein und wieder raus bekommst schau dir mal 'union' an (GOOGEL suchen).
Du kannst ja einfach erstaml alle ankommenden Daten lesen und den ersten Wert auwerten. Wenn dieser dann die Id der Aktion beinhaltet kannst du einfach per switch/case an die richtige Stelle springen und die Restdaten verarbeiten.

Bsp Spieler Bewegung

CPP:
...
// ID des Befehls auslesen
short command = ReadCommand(empfangeneDaten);

// Befehlsunterscheidung
switch(command)
{
    case 13: // Bewegung eines Spielers
    {
          // Id des Senders auslesen
          // muss nicht in einer Funktion sein
          short playerId = getPlayerId(empfangeneDaten);

          // hier vieleicht für den Server relevante Sachen erledigen
          ...

          // an alle anderen Spieler senden
          for(short player = 0; player < _Players.Length(); player++)
          {
              // den eigentlichen Sender überspringen
             if(_Players[player].Id !=  playerId)
             {
                  // Hier vieleicht den Befehl durch einen Serverbefehl ersetzen
                  // oder auch nicht ;)
                  ...

                  // Daten an den Spieler senden
                  // empfangeneDaten wure modifiziert oder auch nicht
                  sendMessage(empfangeDaten,_Players[player].Socket);
              }
          }
          // Nicht den Rest der Caseblöcke ausführen
          break;
    }
}


So in etwa könnte es aussehen. Beachte das es hier reiner Pseudocode ist und nur wie C++ aussieht Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 31.12.2006, 16:21    Titel: Antworten mit Zitat

raknetist eine Bibliothek, die das netzwerkleben erleichtern kann. Ich habe selber keinerlei Ahnung, aber ich denke, wenn du nicht alles selber amchen willst, könnte das ein Anhaltspunkt sein. Mit der Lizens musste halt ein wenig aufpassen, aber für Freeware oder privaten gebraucht müsste die sogar kostenlos sein.

http://www.rakkarsoft.com/

Viel Spaß Wink

(Netzwerk ist so oder so sehr schwer aber wenn du umbedingt willst, dann vrusch dein Glück. Schwer bedeutet nicht unmöglich, also los!)
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 01.01.2007, 19:14    Titel: Antworten mit Zitat

Chriss hat Folgendes geschrieben:

Genauso würde ich Positinsberechnungen auf dem Client vornehmen und Schadenspunkte vom Server berechnen lassen.

So hab ich das gemacht, nur, dass auch dieSchadenspunkte vom Client berechnet wird. Der Server ist dann quasi nur eine Art Archiv, in dem "nur" die Daten der Clienten gesammelt werden und allen mitgeteilt wird. Das hat bis jetzt noch recht gut funktioniert. Die Verbindung mach ich mit TCP/IP und brauche daher für jeden Mitspieler einen eigene Thread. Der wo den Server startet bekommt ebenfalls eine Client-Verbindung mit dem Server über die IP 127.0.0.1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
sp3cK-r0LL3
Senior JLI'ler


Alter: 34
Anmeldedatum: 18.06.2004
Beiträge: 275

Medaillen: Keine

BeitragVerfasst am: 01.01.2007, 22:27    Titel: Antworten mit Zitat

übrigens wird z.B. bei 3d-shootern viel interpoliert, z.B. bei Quake3; man kann sich die config so umschreiben, dass man die Gegner sogar noch hinter einer Mauer treffen kann, dank client-seitiger Interpolation
_________________
sex is updatedb; locate; talk; date; cd; strip; look; touch; finger; unzip; uptime; gawk; head; apt-get install condom; mount; fsck; gasp; more; yes; more; umount; apt-get remove --purge condom; make clean; sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum