(Game)Server Status abfragen und auswerten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • (Game)Server Status abfragen und auswerten

    Hallo,

    ich würde gerne Lifestats für unsere Gameserver (BF1942 && CS:S) coden, aber ich steig da nicht so wirklich durch.

    Für BF1942 habe ich zwar was fertiges gefunden, aber ich möchte keinen Code von anderen einbauen, sondern mir ist es wichtiger zu verstehen, was passiert. Wie geht man generell vor, das ich mit dem Server "reden" muss, ist mir wohl klar, aber wie spreche ich seine Sprache?

    Ich nehm als Beispiel mal dieses BF Script, vllt könnt Ihr mir das erklären bzw mich verbessern

    PHP-Code:
    $socket fsockopen("udp://$ip"$port, &$errno, &$errstr);
    /* Ein Socket ist, soweit ich weiss die Kombination aus IP und Port, wenn 
    das Socket angelegt werden konnte, heisst das soviel wie: Server ist über
     UDP mit der IP und dem Port erreichbar, oder?*/ 
    Falls das $socket exstiert (true), geht's so weiter

    PHP-Code:
    @socket_set_timeout($socket2);
    /* Setzt den Timeout Wert, aber wofür genau? Wenn es doch zum Timeout
     kommt, wäre $socket doch vorher schon false, oder?*/ 
    Was nun kommt, versteh ich absolut rein gar nicht mehr

    PHP-Code:
    fwrite ($socket"\xff\\status\\") or die("Socket zum konnte nicht angelegt werden");
    /* hääh? fwrite bei Files kann ich ja noch nachvollziehen, aber was passiert
     hier genau? und was soll "\xff\\status\\" bedeuten?*/ 
    Dann gehts so weiter...

    PHP-Code:
    $header fgets($socket2);
    // Ab hier bekomme ich wirklich Daten zum Auswerten
    if (!$header) {
        
    // Server nicht erreichbar???
    } else {
        while (
    $var) {
            
    $str fgets($socket2); // Warum schon wieder, ist doch das gleiche wie beim $header?
            
    $tmpdata .= $str;
            if ( 
    preg_match("/queryid(.*)\.1/i"$tmpdata)) {
                
    $var false;
            }
        }
    }
    // in $tmpdata habe ich nun tasächlich Daten zum Auswerten 
    Wäre nett, wenn mir das mal jemand vernünftig erklären kann, und was man vllt besser machen sollte, würde mich auch interessieren. Danke
    Zuletzt geändert von MehrMeerHer; 31.12.2004, 14:54.

  • #2
    Hallo im Forum!

    schau dir bitte dies an:
    richtiges Posten (Wir haben nicht alle eine Auflösung von 5200x4600 )

    Kommentar


    • #3
      Tschuldigung, ich glaub ich setz mal ein paar Zeilenumbrüche innerhalb der PHP Tags

      Kommentar


      • #4
        Mit fwrite schickst du was an den Server, hier das xff\status\ - vermutlich sagt das dem Server, dass er seinen status an dich zurückschicken soll.

        Mit fgets liest du die Daten, die der Server schickt dann ein - und zwar nicht alles auf einmal, sondern Stück für Stück, und deshalb wird das auch mehrmals ausgeführt.
        hopka.net!

        Kommentar


        • #5
          danke, übrigrns nette Sache hier mit dem man Tag

          Original geschrieben von Hopka
          Mit fwrite schickst du was an den Server, hier das xff\status\ - vermutlich sagt das dem Server, dass er seinen status an dich zurückschicken soll.
          aber woher weiss ich, dass ich genau diesen String benötige, um den Status abzufragen. Gibt es für solche Sachen eine Art "Kommunikationsliste" bzw. ist das dann programmiersprachen unabhängig? Wenn ich das nämlich so mit CS:S teste, passiert gar nüscht

          Mit fgets liest du die Daten, die der Server schickt dann ein - und zwar nicht alles auf einmal, sondern Stück für Stück, und deshalb wird das auch mehrmals ausgeführt.
          ok, aber warum liest 'man' die denn so ein und nicht direkt vollständig?
          Zuletzt geändert von MehrMeerHer; 31.12.2004, 15:18.

          Kommentar


          • #6
            Original geschrieben von MehrMeerHer
            danke, übrigrns nette Sache hier mit dem man Tag
            man Tag ist für Insider

            das habe ich wohl vermutet, aber woher weiss ich, dass ich genau diesen String benötige, um den Status abzufragen. Gibt es für solche Sachen eine Art "Kommunikationsliste" bzw. ist das dann programmiersprachen unabhängig? Wenn ich das nämlich so mit CS:S teste, passiert gar nüscht
            hmm teilweise kann via Protokolle zum gewünschten ERgebnis, teilweise auch über irgendwelche Files auslesen....

            Du kannst dich mal von einer CS Source Klassen berieseln lassen welche die aktuellen Serversachen ausliest
            http://www.phpclasses.org/browse/package/1815.html

            Reggen vorausgesetzt

            ok, aber warum liest 'man' die denn so ein und nicht direkt vollständig?
            Weil man vielleicht so "schlau" ist und zeilenweise reagiert anstatt komplett auszulesen und dann wiederrum zeilenweise zu reagieren....
            Man kann auch komplett alles auslesen und dann mit Performance fressenden Ausdrücken sich das ganze rauspicken.......
            [color=blue]MfG Payne_of_Death[/color]

            [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
            [color=red]Merke:[/color]
            [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

            Murphy`s Importanst LAWS
            Jede Lösung bringt nur neue Probleme
            Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
            In jedem kleinen Problem steckt ein großes, das gern raus moechte.

            Kommentar


            • #7
              ok, danke. ich werd das erstmal verarbeiten und euch später weiter nerven

              Kommentar


              • #8
                Original geschrieben von MehrMeerHer
                aber woher weiss ich, dass ich genau diesen String benötige, um den Status abzufragen
                Das wird wohl irgendwo in der Dokumentation von dem Server stehen, den du da fragst, das hat mit PHP nicht mehr zu tun. Es geht dabei nur darum, auf welche Befehle der andere Server "hört".

                Original geschrieben von MehrMeerHer
                ok, aber warum liest 'man' die denn so ein und nicht direkt vollständig?
                Vermutlich, weil du nicht weiß, wie viele Daten da insgesamt kommen, oder du nicht alle Daten brauchst, die der Server verschickt, und du Zeit sparen kannst, indem du nur die wirklich nötigen ausliest. Das hängt aber auch wieder von dem anderen Server ab, weil du wissen musst, was er sendet.
                hopka.net!

                Kommentar


                • #9
                  zunächst, danke nochmal

                  Das Prinzip habe ich jetzt verstanden, auf der Suche nach brauchbaren Docs für den CS:S Server bin ich jetzt über die mailing list an die diese Links hier geraten:

                  http://www.mail-archive.com/hlcoders.../msg07640.html
                  http://wiki.hlsw.de/wiki/index.php/H...frageprotokoll

                  So richtig steig ich da aber nicht durch, ich such noch den Zusammenhang, vllt könnt Ihr mir da helfen?

                  Ist zwar nicht mehr so wirklich PHP, aber es gibt hier bestimmt Leute, die das verstehen

                  Die offizielle Info bezüglich des Query Protokols sieht ja so aus

                  Code:
                  #define S2A_INFO_SRC                    'I'     // + Address, hostname,
                  map, gamedir, gamedescription, active players, maxplayers, protocol
                  
                  
                          unsigned char controlByte = msg->ReadByte();
                          if (controlByte != S2A_INFO_SRC) //
                                  return false;
                  
                          // read protocol version
                          msg->ReadByte();
                  
                          Q_strncpy(server.name, msg->ReadString(), sizeof(server.name));
                          Q_strncpy(server.map, msg->ReadString(), sizeof(server.map));
                          Q_strncpy(server.gameDir, msg->ReadString(),
                  sizeof(server.gameDir));
                          strlwr(server.gameDir);
                          Q_strncpy(server.gameDescription, msg->ReadString(),
                  sizeof(server.gameDescription));
                          msg->ReadShort();
                  
                          server.players = msg->ReadByte();
                          server.maxPlayers = msg->ReadByte();
                          server.botPlayers = msg->ReadByte();
                  
                          msg->ReadByte();        // dedicated
                          msg->ReadByte();        // OS
                          server.password = msg->ReadByte();
                          server.secure = msg->ReadByte();
                  Die Leute von HLSW haben daraus diese Info zusammengestellt:

                  Code:
                  Anfrage 
                  UINT32   Wert 0xFFFFFFFF  
                  BYTE  Kontrollbyte  0x54  
                  [bearbeiten]Antwort 
                  UINT32   Wert 0xFFFFFFFF  
                  BYTE  Kontrollbyte  'I' (S2A_INFO_SRC)  
                  BYTE  Protokoll Version   
                  SzString  Servername   
                  SzString  Map Name   
                  SzString  Spielverzeichnis   
                  SzString  Spiel Name   
                  UINT16  application ID  Wird im z.Z. nicht verwendet  
                  BYTE  Spieleranzahl   
                  BYTE  Maximale Spieleranzahl   
                  BYTE  Anzahl der Bots   
                  BYTE  Dedicated  'd' dedicated, 'l' listen, 'p' hltv proxy  
                  BYTE  Betriebssystem  'l' linux, 'w' windows  
                  BYTE  Passwort  Ob der Server Passwortgeschützt ist  
                  BYTE  Secure  Valve Anti Cheat aktiviert?
                  Ich versteh schon mal nicht´, wie die das hinbekommen haben...

                  Aber die Anfrage wird mir deutlicher:

                  Der in der CS:S (PHP) Klasse benutzte Infoquerystring sieht so aus
                  Code:
                  \xFF\xFF\xFF\xFF\x54
                  Woher weiss ich, dass ich den genau SO zusammensetzen muss, wenn ich diese Info habe

                  Code:
                  Anfrage 
                  UINT32   Wert 0xFFFFFFFF  
                  BYTE  Kontrollbyte  0x54
                  ok, ich sehe, dass Beide mit x anfangen, aber woher weiss man, dass aus 0xFFFFFFFF das \xFF\xFF\xFF\xFF wird, das x wird wohl escaped, aber was hat es damit auf sich?

                  Bin für jeden Tip dankbar

                  Kommentar


                  • #10
                    0xFF bzw. \xFF zeigt an, dass danach Hexadezimalzahlen kommen -
                    Und aus FFFFFFFF wird \xFF\xFF\xFF\xFF weil Hexadezimalzahlen aus 2 'Ziffern' bestehen (kann's irgendwie grad nicht so richtig erklären, am besten du informierst dich selber mal über Hexadezimalzahlen )

                    Die Antwort, die du dann kriegst, besteht halt wie angegben aus Bytes, Integern (UINT32 = 32 Bit bzw. 4 Byte und UINT16 = 16 Bit bzw. 2 Byte) und Strings - am besten du lässt dir das Ergebnis von so ner Abfrage mal ausgeben, und guckst erstmal, was du so damit anfangen kannst, jetzt wo du das Format kennst
                    hopka.net!

                    Kommentar


                    • #11
                      danke Hopka, auf dich kann man zählen

                      Kommentar

                      Lädt...
                      X