AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Query an Gameserver

Query an Gameserver

Ein Thema von Flodding · begonnen am 18. Feb 2015 · letzter Beitrag vom 1. Nov 2015
Antwort Antwort
Seite 3 von 12     123 45     Letzte » 
Flodding

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

AW: Query an Gameserver

  Alt 18. Feb 2015, 20: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
 
#22

AW: Query an Gameserver

  Alt 18. Feb 2015, 21: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
 
#23

AW: Query an Gameserver

  Alt 18. Feb 2015, 21: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
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#24

AW: Query an Gameserver

  Alt 19. Feb 2015, 00:19
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.
Habs jetzt per Zufall ..
Voodoo, Lotto, Zauberei??
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (19. Feb 2015 um 00:22 Uhr)
  Mit Zitat antworten Zitat
Flodding

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

AW: Query an Gameserver

  Alt 19. Feb 2015, 17:29
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:
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
Da haben wir die besagten doppel 00en von denen vorher gesprochen wurde.
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 ?
Flo

Geändert von Flodding (19. Feb 2015 um 17:31 Uhr) Grund: HEX Code Forumfreundlicher gestaltet
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#26

AW: Query an Gameserver

  Alt 19. Feb 2015, 17:50
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Flodding

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

AW: Query an Gameserver

  Alt 22. Feb 2015, 11:32
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.
https://github.com/xPaw/PHP-Source-Q...cket.class.php

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:
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;
jetzt das ganze mit Spieler und Map
Code:
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;
Die Unterschiede konnte ich leider nicht FETT markieren, habe sie aber kommentiert.

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:
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;
MFG
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
 
#28

AW: Query an Gameserver

  Alt 22. Feb 2015, 12:45
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
NameDescriptionByte-Länge
byte8 bit character or unsigned integer1 Byte
short16 bit signed integer2 Byte
long32 bit signed integer4 Byte
float32 bit floating point4 Byte
long long64 bit unsigned integer8 Byte
stringvariable-length byte field, encoded in UTF-8, terminated by 0x00solange ein Byte lesen, bis man $00 liest

Wenn ich dann lese, dass du die ID (Steam Application ID of game) da vermutest
Code:
8A8400; Diese beiden Zeilen sollten eigentlich
3300;  Eine Zeile sein. 00 Problem. Sie beinhalten die ID (33930), Anzahl Spieler und Max Spieler
dann hast du die Dokumentation nämlich nicht gelesen.

Wenn ich jetzt mal deine Daten dem Response Format laut Dokumentation zuordne, dann erhalte ich
FieldTypeBytesRAW-Data
Headerbyte149
Protocolbyte111
Namestringvar5B4C2D542D535D2045706F6368204F726967696E732028312E302E352E312F3132353534382900
Mapstringvar5461766900
Folderstringvar61726D61326172726F77706300
Gamestringvar4461795A2045706F6368204F726967696E7300
IDshort28A84
Playersbyte100
Max. Playersbyte133
Botsbyte100
......... 
Vergleiche das mit deinen Angaben und du solltest den Fehler feststellen.
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)

Geändert von Sir Rufo (22. Feb 2015 um 12:48 Uhr)
  Mit Zitat antworten Zitat
Flodding

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

AW: Query an Gameserver

  Alt 22. Feb 2015, 13:02
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.
Flo

Geändert von Flodding (22. Feb 2015 um 13:05 Uhr) Grund: Frage wegen GAMEID
  Mit Zitat antworten Zitat
BadenPower

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

AW: Query an Gameserver

  Alt 22. Feb 2015, 13:16
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.
Das sagt mir, dass Du nie versucht hast 33930 in ein Hex umzuwandeln, denn dann hättest Du gesehen , dass 33930 ToHex-> 848A ist.

Na, fällt Dir etwas auf?
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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:12 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