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