![]() |
Query an Gameserver
Hallo guten Morgen :cry:
Ich bastel seit ein paar Tagen an einem Launcher/Joiner fr meinen Gameserver (Arma2 - Dayz). Dieser kann erkennen ob die richtigen Mods in der richtigern Version vorliegen und kann bei bedarf auch korrupte oder neue Dateien anfordern und Downloaden. Jetzt mchte ich im Launcher auch noch gerne anzeigen Lassen wie viele Spieler sich aktuell auf dem Server befinden. Eventuell auch die Spielernamen; ist aber nicht so wichtig. Aktuell regel ich das ber ein PHP-Query-Script, da ich dies als fertige Lsung gefunden habe. Quelle: ![]() Hier ein Link zum bereits konfigurierten Script: ![]() Jedoch mchte ich mit meinem Launcher nicht erst Text aus einer von PHP erstellten Seite auslesen und ihn dann anzeigen. Das kann ja auch direkt geschehen. Zum Thema Delphi & Query an Source Server habe ich schon einiges gefunden, jedoch stoe ich an einem Punkt an meine Grenzen. Es gibt ein Beispielprojekt, welches aufzeigt, wie ein Query an einen Source Server gesendet wird und empfangene Daten ausliest. Quelle: ![]() Dies Funktioniert auch ganz gut wenn man den Server und Port angibt. In meinem Fall wre das IP:5.45.97.44 Port:2301 Wer sich das Projekt nicht erst laden mchte ums selber auszuprobieren... hier die Ausgabe:
Code:
Das ist auch erstmal ganz okay dass das so ausgegeben wird. Jedoch kann ich keine Ausgabe der aktuellen Anzahl der Spieler bzw. das Maximum der Spieler erkennen. Und ja, der Server war nicht Spielerlos.
I[L-T-S] Epoch Origins (1.0.5.1/125548)Taviarma2arrowpcDayZ Epoch OriginsŠ„dw1.63.125548 `7'X@bt,r163,n125548,s7,i1,mf,lf,vf,dt,tcoop,g65545,c2147483647-2147483647,pw,Š„žP…Nb~PP30#f/D0žB0jCz'P3„#f/D„žB„jCz',جq!8x7P7wqbju<–q'ƒHbu0u„4kukua~'ƒ ”Ž/}u€Uv' ”Ž`uhtu'; )sP' ”Ž)soY.Dz'z'JAY<Ba<B;&DX0wh€
Œ@"A$Z<+w œ0w$W-w<+wȹw6ŒPŒz'|PŒtŒmuPŒ( pP˜ŸY˜ŸŒŠ0wh€ŒP`(Œ0wЪ8+w“ɹwŒŒP˜ŸP3'PŒŒPŒ(jC5wŒ(Š5w˜Ÿ€ŒŒPŒ„(qeW0W3wh45wŒŒ*wŒŒ*wx5w8Œ”5wɹwŒ Weiterfhrende Informationen sollte ich hier bekommen: Quelle: ![]() Das einzige was ich noch verstehe ist, dass der Header & das Paket von A2S_Info im Delphi Quellcode angegeben wurde. Laut der Informationen auf der Valve Seite sollte doch auch die Anzahl der Spieler mit ausgegeben werden. :cry: Nun gut. ich poste nochmal den Code der das Paket senden und Empfngt:
Delphi-Quellcode:
Beim Kompilieren kommt bei mir die Meldung:
procedure TForm4.Button1Click(Sender: TObject);
var x: array[0..25] of byte; y: array[0..1248] of byte; i,ctr,r,p: integer; servername:string; currentmap:string; begin memo1.Clear; udp1.RemotePort:= edit2.Text; udp1.RemoteHost:= edit1.Text; udp1.Active:= true; // The following bytes represent the query 'TSource Engine Query' // This can be applicable to HL1 too. 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)); i:= 0; ctr:= 0; r:= 0; udp1.ReceiveBuf(y,sizeof(y)); repeat begin if y[i] = $00 then begin inc(ctr); if ctr = 1 then r:= i; if ctr = 2 then begin p:= i; servername:= copy(memo1.Text,r+1,(i-r)-1); lblservername.Caption:= servername; end; if ctr = 3 then begin currentmap:= copy(memo1.Text,p,(i-p)-1); lblcurrentmap.Caption:= currentmap; end; end; memo1.Text:= memo1.Text + chr(y[i]); inc(i); end; until i = 1248; end; Die Methode udp1Receive, auf die udp1.OnReceive verweist, enthlt eine inkompatible Parameterliste. Soll der Verweis entfernt werden? Dort kann NEIN geklickt werden und das Programm tut, was es soll. Andere Quellen verwiesen auch auf die INDY9/10 Komponenten die man verwenden kann. Ich bin verwirrt wie ich weiter machen kann und wrde mich sehr freuen wenn sich ein kundiger der Materie hier melden wrde um mir zu helfen. Danke im Voraus. Florian |
AW: Query an Gameserver
Was hast du denn fr eine Ausgabe erwartet?
Zitat:
Stell dir vor, die senden dir als Wert 42 um mit auszudrcken, dass der Server luft und auch ansonsten alle Fragen damit zu beantworten. Diese Information - was bedeutet 42 - muss du wissen, sonst ist es Essig mit der Information. Also hole dir die Beschreibung zu dieser Bytefolge, damit du interpretieren kannst, was dir diese Bytes sagen wollen. |
AW: Query an Gameserver
Zitat:
Und poste noch die Deklaration der Methode udp1Receive welche dem OnReceive zugewiesen wurde. |
AW: Query an Gameserver
Zitat:
Ich verstehe zwar was du mir sagen mchtest mit dem entschlsseln. Soll ich jetzt diese kryptischen Zeichen umwandeln? Warum gibt er die ersten Informationen in Klartext aus, den Rest aber nicht? Im PHP-Script wirds ja dann auch irgendwo entschlsselt, nur finde ich nicht wo. Zitat:
Delphi-Quellcode:
procedure udp1Receive(Sender: TObject; Buf: PWideChar; var DataLen: Integer);
procedure TForm4.udp1Receive(Sender: TObject; Buf: PWideChar; var DataLen: Integer); begin packlen:= datalen; end; |
AW: Query an Gameserver
Zitat:
Delphi-Quellcode:
procedure udp1Receive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer);
Und dann schau Dir die erhaltenen Daten noch mals an. |
AW: Query an Gameserver
Zitat:
Das einzige Problem was es hier gibt ist, dass der Server Binrdaten sendet und Flodding reinen Text erwartet. Flodding: Da wird nirgendwo eine "8" stehen sondern eher sowas wie "◘". Auerdem ist da nichts verschlsselt sondern es sind halt einfach nur Binrdaten und kein String... |
AW: Query an Gameserver
Zitat:
Ach Du arbeitest mit Delphi2010, andere aber nicht. Unter Delphi2007 zum Beispiel ist dort PAnsiChar und nicht PWideChar. Wenn ich dann die Funktionsdeklaration in PWideChar nderen, dann kommt exakt die Fehlermeldung wie beim TE. Und nun schau einmal mit was der TE arbeitet. |
AW: Query an Gameserver
Zitat:
Du hast Recht. |
AW: Query an Gameserver
Zitat:
Ich erwarte keinen Klartext... das hab ich vorher auch nicht erwhnt ... ich habe nur gefragt, warum der erste Teil als Klartext ankommt, der Rest aber nicht. Ich habe hier mit der Bitte um Hilfe geschrieben. Wie funktioniert das mit den Birnrdaten? wie wandele ich das in Klartext um ? |
AW: Query an Gameserver
Zum besseren Verstndnis mal ein Beispiel:
Du fragst eine API von mir ab und bekommst als Rckgabe ein Byte mit dem Dezimalwert 42. Was bedeutet das? Erstmal gar nichts. In einem Text-Control dargestellt siehst du ein
Delphi-Quellcode:
.
*
Ohne weiteres Wissen ber den Kontext weisst du nur, dass ich dir ein Byte geliefert habe, was nun alles mgliche bedeuten kann. Es kann tatschlich bedeuten, dass es sich um ein Zeichen handelt und dann wre es eben
Delphi-Quellcode:
.
*
Es kann bedeuten, dass die Motoren 1,3,5 laufen und die Motoren 0,2,4,6,7 nicht laufen
Delphi-Quellcode:
.
00101010
Es kann bedeuten dass die beiden Lampen A und B mit der Helligkeit 66% und 13% leuchten sollen
Code:
Die wirkliche Bedeutung bekommt man ausschlielich ber den Kontext und den erfhrt man vom Erzeuger dieser Daten, denn der legt diesen Kontext fest.
42d => 2Ah
A -> Ah => 10d / 15d = 66.66% B -> 2h => 2d / 15d = 13.33% |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 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