AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Query an Gameserver
Thema durchsuchen
Ansicht
Themen-Optionen

Query an Gameserver

Ein Thema von Flodding · begonnen am 18. Feb 2015 · letzter Beitrag vom 1. Nov 2015
 
Flodding

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

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
 

 

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 21:34 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