![]() |
AW: Query an Gameserver
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:
Ich weiss leider nicht, wie ich in Delphi aus dem Byte was zurück kommt nur die Strings auslese...
$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; |
AW: Query an Gameserver
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
Code:
Schauen wir uns das Datenpaket an, dann finden wir die ersten 4 Bytes mit
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
Delphi-Quellcode:
, dann den Header mit
FF
Delphi-Quellcode:
und der Rest ist der String ... öh, bis auf das letzte Byte
54
Delphi-Quellcode:
.
00
Nächstes Beispiel angesehen
Code:
Aha, da sind ja wieder diese
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.
Delphi-Quellcode:
Bytes zwischen den einzelnen Strings. Sehr schön.
00
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). |
AW: Query an Gameserver
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:
Das geschieht gleich nachdem ich das Paket mit dem Challengekey gesendet habe.
udp1.ReceiveBuf(y,sizeof(y));
players := IntToStr(y[5]); label7.Caption := players; |
AW: Query an Gameserver
Wenn y ein Array of Byte/Integer.. ist, dann sollte das immer funktionieren. Ob das Ergebnis immer richtig ist (im Sinne der erwarteten Information), steht auf einem anderen Blatt.
Gruß K-H P.S. Zitat:
|
AW: Query an Gameserver
Okay also ich habe mich entschieden einen anderen Ansatz zu verfolgen...
dass mir gestern die Aktuelle Spielerzahl gezeigt wurde, bzw. immernoch gezeigt wird, liegt scheinbar dadran, dass ich das BYTE direkt auslesen kann weil es noch eine kleine Zahl ist. Wird die Spielerzahl größer, denke ich dass ich dann anders auslesen muss... Also ich habe es jetzt hinbekommen, mir den HEX Code anzeigen zu lassen. Wandele ich diesen in String um, habe ich wieder meine kryptischen Zeichen. Offenbar bin ich auf dem richtigen weg, denn JETZT ist die ausgabe der Antwort gleich der Beispiele von Sir Rufo...
Code:
Da haben wir die besagten doppel 00en von denen vorher gesprochen wurde.
FFFFFFFF49115B4C2D542D535D2045706F6368204F726967696E732028312E302E3
52E312F3132353534382900546176690061726D61326172726F777063004461795A 2045706F6368204F726967696E73008A8401190064770000312E36332E313235353 43800B1FE08099448375C14400162742C723136332C6E3132353534382C73372C69 312C6D662C6C662C76662C64742C74636F6F702C6736353534352C6332313437343 8333634372D323134373438333634372C70772C008A8400000000000000000000C4 F01800265D3277F0F4180047444546A08A40034003000000000000F4F018009CF21 80040030000F8F4180000F1180064FB33770000010030374103EE0B000000000000 CCF118002CF218008BF23377CCF118000CF2180000F218000000000000000000A08 A400334F11800EBAE3377E08D4003A08A40032CF21800F4F11800E8F1180000F218 000CF21800244A4003000000000000000048F11800C55E3277F0F41800010000000 0000100BD7B3377F0F41800000000000100010033BD0000C015370030F31800FFFF FF00B8F2180010233F00B8F21800662F4400B8F2180000000000C015370030F3180 09EC24200C015370030F318006AF14300000000007A0F2600C015370000000000FF FFFFFF33BD0000C015370084F31800FFFFFF000CF3180010233F000CF31800662F4 4000CF3180000000000C015370084F318009EC24200C015370084F318006AF14300 000000007A0F2600C0153700184840030200320032001800C810400304003200320 018003412400308003200320018009CF21800010000015400180000000100B8132F 77244A40030C0003000300000000003200341240030000000032000000C81040030 1000000F8F41800F0F4180000000000288E40033C00000000000000010001000000 0000F8F41800F0F418001848400332000000F0F418008848400332000000F0F4180 0244A4003030000000300000080F11800000001006C61746E64666C740000000000 080B000B000000F8F21800B22E4400C01537000000000000000000000000007A0F2 60000000000C01537007A0F260000F31800F94A4100B01C3F00593C4200613C4200 C015370090DC3C003B264400A8988F00A9A79877B8988F00B8010000EEFEEEFE0A0 0000058988F0000008E00709A8F00C015370040F3180022B6410000000000390000 0024F418005A3C93770A0000009CB1987724F41800CE579577D33C93777B35EB773 60000000000000000008E0050018E007A0F26007CF3180050018E00080200007C01 8E00E4F3180039000000046DC07650018E0043000000C03C9000F3BA00004300000 0010000000A0000000000000070000000FFFFFFFFA0988F000000000002000406E0 F88F004902044F00000000E01210C3000000007F000000E4F518006502046300008 E008AA69877B8988F00B8010000EEFEEEFE00008E0058988F00000000003900043D 20067D00B0988F00A0FD8F00E0F88F00C80100003900000010F5180000008E00E8A C987768988F0008020000AA3893774F34EB770000000000008E0060988F0000008E 00010000000200040620067D006502046320067D0033BD00008C08011150018E000 0008E000000000050018E00A0FD8F006AF1430000000000ACF4180006089D770000 8E00000000004300000004000000010000000400000000000000C03C90000000000 0180200007F0000008A109D774902044F4300000080018E00000000000000000000 008E0050018E000000000060988F0000000001A0FD8F004300000000000000F5710 00100000000430000006557000030F41800D0579B7768F5180034F5180006089D77 00008E000000000000008E0058988F00EAB8927758988F0000008E0000008E00EAB 8927758988F0078F51800B0179D7738018E0094179D772734EB77 Im oberen Bereich noch ganz annehmbar und überschaubar, reihen sie sich nach unten hin immer mehr aneinander und ich schaffs einfach nicht das sinnvoll auszulesen und dann von BYTE in STRING bzw. INTEGER umzuwandeln. Dazu kommt, dass offenbar mehrere HEADER mitgesendet wurden und mir das dann das Auslesen erschwert, weil bei einer Schleife, die ein Array füllt dann immer wieder der HEADER dazwischen stehen würde. Desweiteren weiss ich nicht wie ich ein Array mit den Daten füllen soll :? Sollte es ein Array mit den BYTES sein ? |
AW: Query an Gameserver
Nein, kein Array. Du bekommst strukturierte Daten, und in dieser Struktur kommen mehrere Typen gemischt vor. Deine ganze Umwandlerei in Strings schmeiss doch einfach mal bitte komplett weg, das führt zu nichts, weil du eben nicht einen String zurück gesendet bekommst. Es ist schlicht die völlig falsche Interpretation der Daten.
Wie die Daten zu interpretieren sind, wird in dem Link zu der Steam Seite haarklein aufgelistet, die weiter vorne hier verlinkt wurde. Da stehen ausführlich ALLE Informationen, die man braucht um die Antwortpakete richtig zu interpretieren. Und wenn alle Stricke reissen, kannst du den fix und fertigen PHP code, den du selbst geposted hast, nach Delphi übersetzen und aus der damit interpretierten Struktur die für dich interessanten Werte nutzen. Komfortabler geht es einfach nicht mehr. Es ist alles da an Infos, sogar eine Beispielimplementierung. Du musst einfach nur mal von dem Trip runter kommen, dass da Strings kommen. Ist nicht so. Das ist keine XML Datei. Komische Zeichen bekommst du nur, weil du die Daten komplett falsch interpretierst. Ja, es sind Abschnitte drin, die einzelne Strings ergeben. Aber das ist halt nicht für alles so. Mache dich am besten erstmal mit einer Hand voll Grundlagen zu Datentypen und der internen Darstellung von Ganzzahlen, Texten und Gleitpunktzahlen vertraut. Das ist absolut elementares Wissen, dass du beim Programmieren praktisch jede Minute brauchst. Es ist also nichtmals so, dass das gelernte so speziell ist, dass es nur auf dein aktuelles Problem zutrifft. Das krasse Gegenteil ist der Fall. |
AW: Query an Gameserver
Hallo nochmal.
Also ich hab jetzt jede Menge ausprobiert und wollte auch anfangen den Code von PHP nach DELPHI zu portieren. Daran scheitere ich jedoch komplett, da ich den PHP-Code nicht 100% verstehe. Des Weiteren ist was von Kompression aufgekreuzt... In diesem Script wird geschaut ob der empfangene Buffer "compressed" ist oder nicht. ![]() Ich weiss nicht wie ich damit umgehen soll. Ich hab nur rausgefunden, dass es scheinbar eine ZLIB Kompression ist. Weiterhin bin ich soweit, dass ich jetzt die ersten 6 empfangenen Informationen sicher empfangen kann. Das wären dann: Header, Protocol, Name, Map, Folder, Game Ab der 6ten bzw. 7ten Information (Map ja oder nein) hapert es jedoch, denn dort steht eine doppel"00" dafür, dass keine Spieler auf dem Server sind und dann erkennt mein Programm aber nur die "00" als Ende der Information und überspringt diese. hier einmal die empfangenen Daten: Mit Map:
Code:
jetzt das ganze mit Spieler und Map
49; Header
11; Protokol 5B4C2D542D535D2045706F6368204F726967696E732028312E302E352E312F3132353534382900; Name 5461766900; Map 61726D61326172726F77706300; Folder 4461795A2045706F6368204F726967696E7300; Game 8A8400; Diese beiden Zeilen sollten eigentlich 3300; Eine Zeile sein. 00 Problem. Sie beinhalten die ID (33930), Anzahl Spieler und Max Spieler 647700; Server Type / Environment 00; ?? Bots ?? Kann ich leider nicht testen, da in diesem Spiel Bots nicht erkannt werden. 312E36332E31323535343800; Spielversion B1FE08031027D86514400162742C723136332C6E3132353534382C73372C69312C6D662C6C662C76662C64742C74636F6F702C6736353534352C63323134373438333634372D323134373438333634372C70772C00; GameTags 8A8400; Game ID , sollte umgewandelt "33930" ergeben. tut es auch nicht. 00; 00; 00; 00; 00;
Code:
Die Unterschiede konnte ich leider nicht FETT markieren, habe sie aber kommentiert.
49;
11; 5B4C2D542D535D2045706F6368204F726967696E732028312E302E352E312F3132353534382900; 5461766900; 61726D61326172726F77706300; 4461795A2045706F6368204F726967696E7300; 8A84013300; Hier wurde Jetzt nicht getrennt, weil "00" zu "01" wude 64770100; Hier ist noch Password hinzugekommen. (getestet) 312E36332E31323535343800; B1FE0801B0DD6A6614400162742C723136332C6E3132353534382C73332C69312C6D662C6C662C76662C64742C74636F6F702C6736353534352C63323134373438333634372D323134373438333634372C70772C00; 8A8400; 00; 00; 00; 00; 00; Also das Sortieren der Bytes anhand der "00"en schlägt in diesem Fall fehl. Jetzt würde ich gerne wissen was ICH falsch mache oder wie ich es besser machen kann... Anbei nochmal der Quellcode mit dem ich die Informationen bekomme.
Delphi-Quellcode:
MFG
procedure TForm4.Button1Click(Sender: TObject);
var A: TStringList; x: array[0..25] of byte; y: array[0..1400] of byte; i: integer; buff_delemitted: string; hexzahl: string; dezimalzahl: integer; server_protocol: string; map_name: string; server_name: string; folder_name: string; game_name: string; game_id: string; server_type: string; server_environment: string; max_players: string; begin memo1.Clear; udp1.RemotePort:= '5.45.97.44'; udp1.RemoteHost:= '2302'; udp1.Active:= true; x[0]:= $FF; x[1]:= $FF; x[2]:= $FF; x[3]:= $FF; x[4]:= $54; x[5]:= $53; x[6]:= $6F; x[7]:= $75; x[8]:= $72; x[9]:= $63; x[10]:= $65; x[11]:= $20; x[12]:= $45; x[13]:= $6E; x[14]:= $67; x[15]:= $69; x[16]:= $6E; x[17]:= $65; x[18]:= $20; x[19]:= $51; x[20]:= $75; x[21]:= $65; x[22]:= $72; x[23]:= $79; x[24]:= $00; udp1.SendBuf(x,sizeof(x)); udp1.ReceiveBuf(y,sizeof(y)); for i := 4 to sizeof(y) - 1 do begin if (IntToHex(y[i], 2) = '49') then begin buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';' end else if i = 5 then begin buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';' end else if (IntToHex(y[i], 2) = '00') then begin buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';' end else begin buff_delemitted := buff_delemitted + IntToHex(y[i], 2) end; Application.ProcessMessages; end; Memo1.Text := buff_delemitted; A := TStringList.Create; try Split(';', buff_delemitted, A) ; server_protocol := inttostr(hextoint(a[1])); server_name := HexStrToString(a[2]); map_name := HexStrToString(a[3]); folder_name := HexStrToString(a[4]); game_name := HexStrToString(a[5]); server_type := HexStrToString(a[7])[1]; server_environment := HexStrToString(a[7])[2]; max_players := HexStrToString(a[8]); finally A.Free; end; end; |
AW: Query an Gameserver
Du willst dir anscheinend nicht die Dokumentation von Valve durchlesen. Dass ist natürlich fatal und daher gebe ich dir nur noch einmal den Rat, dieses dringend nachzuholen.
Ganz oben steht da nämlich die Definition der Data Types
Wenn ich dann lese, dass du die ID (Steam Application ID of game) da vermutest
Code:
dann hast du die Dokumentation nämlich nicht gelesen.
8A8400; Diese beiden Zeilen sollten eigentlich
3300; Eine Zeile sein. 00 Problem. Sie beinhalten die ID (33930), Anzahl Spieler und Max Spieler Wenn ich jetzt mal deine Daten dem Response Format laut Dokumentation zuordne, dann erhalte ich
|
AW: Query an Gameserver
Also ist meine Angehensweise total falsch.
Ich muss Die Reihenfolge der Empfangenen Daten beachten um dann gezielt die Bytes auszulesen. Ich habe ehrlich gesagt die ganze Zeit nicht die Längenangaben hintendran beachtet und somit bin ich von völlig falschen längen ausgegangen. Theoretisch müsste ich in etwa so interpretieren: Header: Lese 1tes Byte und wandele um, Protocol: Lese 2tes Byte und wandele um, Name: Fang an zu lesen nach 2tem Byte und stoppe bei erstem "00" , merke dir wo du aufgehört hast zu lesen!!! Map: Lese weiter wo du vorher aufgehört hast und weiter bis zum nächsten "00"; merk dir wieder die Endposition. Folder: weiter "00" bis "00" lesen, merken, Game: weiter "00" bis "00" lesen, merken, ID: Lese von der LETZTEN Position 2 Bytes weiter und wandele um, merk dir neue Position, Players: Lese 1 weiteres Byte, wandele um und merk dir Position, Max. Players: ....... und so weiter. Korrekt? EDIT: Die ID : 8A84 sollte umgewandelt 33930 ergeben. Tut es aber nicht egal in was ich umwandel. HextoStr gibt Kryptisches, HextoInt gibt eine falsche Zahl: 35460. |
AW: Query an Gameserver
Zitat:
Na, fällt Dir etwas auf? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz