Thema: Delphi Query an Gameserver

Einzelnen Beitrag anzeigen

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, 10: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