![]() |
AW: Query an Gameserver
Du solltest dir mal TMemoryStream oder TByteStream anschauen.
Das was du da machst kann man damit um einiges übersichtlicher/besser/einfacher lösen. Deine ganzen Hexstrings sind total unnötig :duck: |
AW: Query an Gameserver
ja das hat super funktioniert :thumb:
Schlussendlich benötige ich doch noch eine bessere Variante um die Einzelnen Stellen der Antwort auszulesen. So, wie man die Informationen von einem Gameserver per Query abfragen kann, kann man auch die globale serverliste beim Masterserver per Query abfragen. dieses Script habe ich ebenfalls in PHP vorliegen. Hier ein Link zum Script das die Serverliste anzeigt (Laden dauert etwas): ![]() Nicht alle Server in der Liste funktionieren. Problem besteht in den letzten Bytes, die angeben ob der Server Passwortgeschützt ist und ob VAC aktiviert ist.
Code:
Ich kann das auch mit einer IF ELSE Abfrage lösen, aber irgendwie scheint mir das ganze ziemlich "dreckig" programmiert.
Bei Servern OHNE Passwort (647700;00;) funktioniert mein Code.
Bei Servern MIT Passwort (64770100;) funktioniert mein code natürlich nicht, da die letzten Strings des Array dann verschoben werden. Die einen mögen jetzt sagen: "Funktioniert doch, lass es so" . Andererseits verstehe ich die Funktion von Sir Rufo nicht so ganz. Ehrlich gesagt garnicht. Klar ist schon, dass er nur den Header ausliest und überprüft ob die Antwort Gesplittet ist oder nicht. Ich stocke schon an dem punkt, wie ich die ersten 4 Strings, die ja variable Längen haben, auslesen oder definieren soll. Das mit dem TMemoryStream hatte ich schon probiert. Da kam bei mir nur Gemurkse bei raus. Da blicke ich nicht durch. |
AW: Query an Gameserver
Ein kleines Beispiel:
Delphi-Quellcode:
Was du wahrscheinlich machen könntest wär sowas wie:
var
mem: TMemoryStream; intVar, intVarLesen: Integer; boolVar, boolVarLesen: Boolean; begin boolVar := true; intVar := 123; mem := TMemoryStream.Create; try // Integer schreiben mem.Write(intVar, SizeOf(Integer)); // Boolean schreiben mem.Write(boolVar, SizeOf(Boolean)); // Vor dem auslesen den Stream an den Anfang positionieren mem.Position := 0; // Daten in gleicher Reihenfolge auslesen wie sie eingelesen wurden mem.Read(intVarLesen, SizeOf(Integer)); mem.Read(boolVarLesen, SizeOf(Integer)); finally mem.Free; end; end;
Delphi-Quellcode:
var
PreHeader: Array[0..3] of Byte; Header: Byte; Protocol: Byte; tmpChar: AnsiChar; ServerName: AnsiString; begin mem.SetSize({größe des Antwortpakets}); udp1.ReceiveBuf(mem.Memory^, mem.Size); mem.Position := 0; mem.Read(PreHeader[0], SizeOf(PreHeader)); // FF FF FF FF mem.Read(Header, SizeOf(Byte)); mem.Read(Protocol, SizeOf(Byte)); // Aus folgenden kann/sollte man ne Funktion machen ServerName:= ''; repeat mem.Read(tmpChar, SizeOf(AnsiChar)); if (tmpChar <> #0) then ServerName:= ServerName + tmpChar; until tmpChar = #0; // usw.. end; |
AW: Query an Gameserver
Zitat:
Zitat:
Zitat:
Zitat:
Aber so lange wir nicht wissen wie Dein Programm jetzt aussieht, ist das eigentlich nur unverbindliches Geblubber. [OT] Bevor man sich an's programmieren macht, ist es kein Fehler zunächst einmal die zu verarbeitenden Daten zu analysieren, und diese Datenstruktur zu beschreiben. Oft ergeben sich dan ein oder zwei (Record-)Definitionen mit denen dann auf einmal alles ganz einfach ist. Ein kleines Beispiel hierzu ist #32. [/OT] Gruß K-H |
AW: Query an Gameserver
Das Funktionierende war auf die Verbindungsproblematik bezogen. Dies funktioniert jetzt schon soweit, dass wenn der Server nicht erreichbar ist, einfach nichts ausgewertet wird. Ändere ich den Queryport aber auf den Spielport zB, dann hängts immernoch.
Delphi-Quellcode:
da würde spätestens unten bei den Bytes nach den Strings dann wieder die Problematik aufkommen:
ServerName:= '';
repeat mem.Read(tmpChar, SizeOf(AnsiChar)); if (tmpChar <> #0) then ServerName:= ServerName + tmpChar; until tmpChar = #0; Mit Passwort: 8A 84 01 40 00 64 77 01 00 8A84 = Version 01 = Spieler aktuell 40 = Spieler max. 00 = Bots 64 = Typ 77 = Environment 01 = Passwort 00 = VAC status Ohne Passwort: 8A 84 01 40 00 64 77 00 8A84 = Version 01 = Spieler aktuell 40 = Spieler max. 00 = Bots 64 = Typ 77 = Environment --> PASSWORT FEHLT 00 = VAC status Ebenso verhällt es sich bei den aktuellen Spielern auf dem Server. die werden auch als 00 gesendet und somit würden sie dann nur als "stop" für den Stream behandelt werden. |
AW: Query an Gameserver
Ich hab mal aus Deinem HexDump ein Beispiel heraus gefischt:
Code:
Ist der Passwortkenner jetzt nicht gesetzt (x00) oder fehlt er? Und wenn Ja, dan gibt es also mind. 2 verschiedene Satztypen?
8A84
00 00 00 - Bots 00 - Typ 00 - Enviroment 00 - Passwortkenner(?) 00 - VAC status? 00 00 00 C4 Gruß K-H |
AW: Query an Gameserver
Wenn man das so betrachtet, dann macht das mit dem Zerlegen und dem ";" und dem Array am Ende keinen Sinn mehr.
Dann wäre es ja sinnvoller im oberen Teil einfach die ersten 4 variablen Strings zu lesen mit den 00en, danach die Bytes direkt an ihrer Position auszuwerten. Dann ist es egal ob 00 dort steht oder 0000 denn dann stehen die ersten 00 für 0 Spieler und die zweiten zB für 0 Bots. |
AW: Query an Gameserver
Also dieses ganz Rätselraten durch das falsche Zuordnen der einzelnen Bytes ist ja nicht zum Aushalten.
Nimm Papier und Bleistift zu Hand und mach dir mal eine Tabelle mit dem Satzaufbau (Name, Typ, Anzahl der Bytes, Bytes) und trage dann die empfangenen Bytes dort nach den vorgegebenen Regeln ein. So wie ich die Dokumentation lese und verstehe gibt es da nichts mit einem Passwort Feld. Nach Environment (Byte) kommt Visibility (Byte) und danach VAC (Byte). Also frisch ans Werk, das hilft dann auch bei der Umsetzung. |
AW: Query an Gameserver
Zitat:
Code:
Visibility byte Indicates whether the server requires a password:
0 for public 1 for private |
AW: Query an Gameserver
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 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