Delphi-PRAXiS
Seite 5 von 12   « Erste     345 67     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Query an Gameserver (https://www.delphipraxis.net/183987-query-gameserver.html)

Neutral General 24. Feb 2015 12:53

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:

Flodding 24. Feb 2015 12:55

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):
http://last-templers.de/a2epoch/serverlist.php
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:
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.
Ich kann das auch mit einer IF ELSE Abfrage lösen, aber irgendwie scheint mir das ganze ziemlich "dreckig" programmiert.
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.

Neutral General 24. Feb 2015 13:14

AW: Query an Gameserver
 
Ein kleines Beispiel:

Delphi-Quellcode:
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;
Was du wahrscheinlich machen könntest wär sowas wie:

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;

p80286 24. Feb 2015 13:31

AW: Query an Gameserver
 
Zitat:

Zitat von Neutral General (Beitrag 1291284)
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:

Zitat:

Zitat von Flodding (Beitrag 1291285)
ja das hat super funktioniert :thumb:

Schön, dann ist ja gut (aber was ist damit konkret gemeint? :gruebel:
Zitat:

Zitat von Flodding (Beitrag 1291285)
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):
http://last-templers.de/a2epoch/serverlist.php
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:
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.
Ich kann das auch mit einer IF ELSE Abfrage lösen, aber irgendwie scheint mir das ganze ziemlich "dreckig" programmiert.
Die einen mögen jetzt sagen: "Funktioniert doch, lass es so" .

Das was ich bisher von Deinem Programm gesehen habe, war nun wahrhaftig nicht als positives Codierungsbeispiel zu gebrauchen

Zitat:

Zitat von Flodding (Beitrag 1291285)
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.

Man könnte z.B. ein pAnsiChar auf das erste Zeichen eines String zeigen lassen und mit Hilfe dieses Pointers den String auslesen.
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

Flodding 24. Feb 2015 13:43

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:
  ServerName:= '';
  repeat
    mem.Read(tmpChar, SizeOf(AnsiChar));
    if (tmpChar <> #0) then
      ServerName:= ServerName + tmpChar;
  until tmpChar = #0;
da würde spätestens unten bei den Bytes nach den Strings dann wieder die Problematik aufkommen:

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.

p80286 24. Feb 2015 14:01

AW: Query an Gameserver
 
Ich hab mal aus Deinem HexDump ein Beispiel heraus gefischt:
Code:
8A84 
00 
00 
00 - Bots
00 - Typ
00 - Enviroment
00 - Passwortkenner(?)
00 - VAC status?
00 
00 
00 
C4
Ist der Passwortkenner jetzt nicht gesetzt (x00) oder fehlt er? Und wenn Ja, dan gibt es also mind. 2 verschiedene Satztypen?


Gruß
K-H

Flodding 24. Feb 2015 14:23

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.

Sir Rufo 24. Feb 2015 14:43

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.

Flodding 24. Feb 2015 14:56

AW: Query an Gameserver
 
Zitat:

Zitat von Sir Rufo (Beitrag 1291309)
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).

Code:
Visibility   byte   Indicates whether the server requires a password:
0 for public
1 for private

p80286 24. Feb 2015 15:58

AW: Query an Gameserver
 
Zitat:

Zitat von Sir Rufo (Beitrag 1291309)
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.

:thumb: :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr.
Seite 5 von 12   « Erste     345 67     Letzte »    

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