AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Query an Gameserver
Thema durchsuchen
Ansicht
Themen-Optionen

Query an Gameserver

Ein Thema von Flodding · begonnen am 18. Feb 2015 · letzter Beitrag vom 1. Nov 2015
Antwort Antwort
Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: Query an Gameserver

  Alt 18. Feb 2015, 17:31
Code:
case self :: GETCHALLENGE_ALL_CLEAR:
            {
               $this->Socket->Write( self :: A2S_PLAYER, $this->Challenge );
               $this->Socket->Read( 14000 );              
               $Type = $this->Buffer->GetByte( );
               
               if( $Type === 0 )
               {
                  return false;
               }
               else if( $Type !== self :: S2A_PLAYER )
               {
                  throw new InvalidPacketException( 'GetPlayers: Packet header mismatch. (0x' . DecHex( $Type ) . ')', InvalidPacketException::PACKET_HEADER_MISMATCH );
               }
               
               break;
            }
Hier werden die Spieler auf dem Server erkannt ja?

Im oberen Teil des Codes finde ich :

Code:
const A2S_PLAYER   = 0x55;
Dies sollte bedeuten, dass der Buffer den ich senden muss so aussehen sollte:

FF FF FF FF 55

Dabei fehlt mir dann aber dieses Challenge ... das versteh ich nicht was damit gemeint ist.
Flo
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#2

AW: Query an Gameserver

  Alt 18. Feb 2015, 17:39
Hast Du Dir diese Seite schon angesehen, welche Neutral General bereits gepostet hat?

https://developer.valvesoftware.com/wiki/Server_queries
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Query an Gameserver

  Alt 18. Feb 2015, 17:52
Ja und ich lese und lese und lese...

Ich habe das so verstanden:

Insgesammt gibt es 5 verschiedene Arten dem Server Daten abzufragen... diese wären:

A2S_INFO

A2S_PLAYER

A2S_RULES

A2A_PING

A2S_SERVERQUERY_GETCHALLENGE


Um diese Daten abzufragen benötige ich eine UDP/IP Verbindung. Über diese Verbindung muss ich jedes mal den HEADER mitsenden... dieser besteht aus FF FF FF FF (nicht gesplittetes Paket) oder FF FF FF FE (gesplittetes Paket). Da die Größe der Daten die ich abfragen will gering ist, gehe ich davon aus, dass ich nur den ersten HEADER benutzen muss. Somit haben wir den ersten teil des Buffers schon zusammen.

FF FF FF FF

um jetzt die gewünschten Daten zu bekommen muss ich das benütigte Byte hinten dranhängen.
Flo
  Mit Zitat antworten Zitat
Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Query an Gameserver

  Alt 18. Feb 2015, 18:39
Okay ... also ich habe jetzt verstanden, dass ich für die Spieler erst ein Challenge brauche...

dieses Challenge bekomme ich auch...

FF FF FF FF 55 FF FF FF FF

Damit bekomme ich dann folgende ausgabe im RAW format:

Code:
ÿÿÿÿA1º
Lðˆ' €x1€ÖvŸs '/à' øïŒ+Çvà'¤
'ð½jÇvBòðFtÆvà'Bò`ð(BÇvBò   'ü'   'à' 'T 'XðhiÇvà'xð ŒÆvSzÆv*  BòÄðeT¼vBòÄð².D$ñÿÿÿÿà'ÀðìðPñ$ñÈ pqçÈ ôðùJA°íY<Ba<BpqçÜê;&DñR&DZ&DÈñ¹r¹u»t¹u¶c…ûƒž¶cÿÿÿÿ…Îv¶c¶c*i¹uvr¹uWr¹u¶c©¶cpñ(zq¹uøÎv6q¹u(¶c¶c¶clñ¶c°ñŒj¹uðv¥…ûƒ òd q¶c…ûƒûƒ€1/}¹u/}¹u4òجqJ4p;H;wqbj¹u(ò– qûƒ4òb¹u0Àuôpò4k¹uk¹uÎvûƒ€1/}¹ulòëUÑvY Z€1â`¹uht¹uY Z; óðû)s¶cY Z€1ÿû)sò°´FY Z€x1¶cЙ!sðv¥ðv¥ ó,p¹uðv¥_¶cЙ!s&ëƒüÀ2©§0wÐ2Xîþîþ
p2/(2Й!sò°
$ôZ<+w
œ±0w$ôÎW-wÓ<+w©±Mu6/P/Í«ºÜP/¨t/¤ó
èÖvP/h2”ÎvЙ!s
$¸2Øû0pw‘m¹uxpw/Š¦0wÐ2Xîþîþ/p2
   ¶cÈ2h2Øû0h
õ/è¬0w€2¨ª8+w°Mu/x2/”/Dpw¶c…ò°P//P/h2žÂB€å¬ô5w/h2¸Š5wpw€//P/x2® h2õqeW0ôÐW3whõ4õ5w//p2ê¸*wp2//ê¸*wp2xõ°5w8/”5wõ°Mu/// g§ g
ÿÿÿÿA heisst ja nun dass es die antwort auf die Anfrage ist ein Challenge zu bekommen...

Jetzt ist mein "neues" Problem, dass ich nicht weiss wie ich die nächsten Query senden soll...

FF FF FF FF 55 CHALLENGE im RAW Format?!
Flo
  Mit Zitat antworten Zitat
Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Query an Gameserver

  Alt 18. Feb 2015, 19:52
Okay habs jetzt hinbekommen, dass ich in der RAW data meine Spielernamen sehe...

jetzt hänge ich an dem Punkt die Spielernamen einzeln auszulesen und zu zählen...

hier der php-code der umgewandelt werden muss...

Code:
$Players = Array( );
         $Count  = $this->Buffer->GetByte( );
         
         while( $Count-- > 0 && $this->Buffer->Remaining( ) > 0 )
         {
            $Player[ 'Id' ]   = $this->Buffer->GetByte( ); // PlayerID, is it just always 0?
            $Player[ 'Name' ] = $this->Buffer->GetString( );
            $Player[ 'Frags' ] = $this->Buffer->GetLong( );
            $Player[ 'Time' ] = (int)$this->Buffer->GetFloat( );
            $Player[ 'TimeF' ] = GMDate( ( $Player[ 'Time' ] > 3600 ? "H:i:s" : "i:s" ), $Player[ 'Time' ] );
            
            $Players[ ] = $Player;
         }
         
         return $Players;
Ich weiss leider nicht, wie ich in Delphi aus dem Byte was zurück kommt nur die Strings auslese...
Flo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Query an Gameserver

  Alt 18. Feb 2015, 20:43
Im Prinzip ist es ganz einfach (wenn man sich die Daten genau anschaut).

Dann fällt auf, dass jeder String mit einem 00 Byte abgeschlossen ist.

Wie ich denn darauf komme?

A2S_INFO
  1. Header: byte
  2. Payload: string
Code:
FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69   ÿÿÿÿTSource Engi
6E 65 20 51 75 65 72 79 00                        ne Query
Schauen wir uns das Datenpaket an, dann finden wir die ersten 4 Bytes mit FF , dann den Header mit 54 und der Rest ist der String ... öh, bis auf das letzte Byte 00 .

Nächstes Beispiel angesehen
Code:
FF FF FF FF 49 02 67 61 6D 65 32 78 73 2E 63 6F    ÿÿÿÿI.game2xs.co
6D 20 43 6F 75 6E 74 65 72 2D 53 74 72 69 6B 65    m Counter-Strike
20 53 6F 75 72 63 65 20 23 31 00 64 65 5F 64 75     Source #1.de_du
73 74 00 63 73 74 72 69 6B 65 00 43 6F 75 6E 74    st.cstrike.Count
65 72 2D 53 74 72 69 6B 65 3A 20 53 6F 75 72 63    er-Strike: Sourc
65 00 F0 00 05 10 04 64 6C 00 00 31 2E 30 2E 30    e......dl..1.0.0
2E 32 32 00                                        .22.
Aha, da sind ja wieder diese 00 Bytes zwischen den einzelnen Strings. Sehr schön.

Um dieses jetzt vernünftig zu lösen, baut man sich eine Klasse, die aus einem Stream diese Daten-Formate auslesen kann (so wie im PHP-Skript).
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Query an Gameserver

  Alt 18. Feb 2015, 20:54
Habs jetzt per Zufall irgendwie hinbekommen...

ich lass es nicht mehr in das memo schreiben.
Anstelledessen wandele ich "irgendetwas" von InttoStr und lass es als label anzeigen... anzahl der Spieler funktioniert so...

Aber ich weiss nicht warum

Delphi-Quellcode:
udp1.ReceiveBuf(y,sizeof(y));

players := IntToStr(y[5]);
label7.Caption := players;
Das geschieht gleich nachdem ich das Paket mit dem Challengekey gesendet habe.
Flo
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz