AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Query an Gameserver

Query an Gameserver

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

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

AW: Query an Gameserver

  Alt 26. Feb 2015, 12:03
So werte ich den Buffer aus:
Delphi-Quellcode:
    if chr(response.PacketHeader) = 'fthen
      begin
        for y := 0 to 10 do
        begin
        Move(buffer[i], response.First, SizeOf(response.First)); inc(i, SizeOf(response.First));
        Move(buffer[i], response.Second, SizeOf(response.Second)); inc(i, SizeOf(response.Second));
        Move(buffer[i], response.Third, SizeOf(response.Third)); inc(i, SizeOf(response.Third));
        Move(buffer[i], response.Fourth, SizeOf(response.Fourth)); inc(i, SizeOf(response.Fourth));
        Move(buffer[i], response.Port, SizeOf(response.Port)); inc(i, SizeOf(response.Port));
        Form1.ListBox1.Items.Add(IntToStr(response.First) + '.' + IntToStr(response.Second) + '.' + IntToStr(response.Third) + '.' + IntToStr(response.Fourth) + ':' + IntToStr(response.Port));
        Application.ProcessMessages;
        end;
      end;
    end;
Die 10 Server die bei mir rauskommen:

89.163.212.29:64776
89.163.202.2:34921
78.51.20.26:64776
91.64.197.127:34921
213.23.101.70:34921
134.255.218.121:53781
134.255.236.171:34921
134.255.217.20:34329
134.255.220.9:18460
134.255.217.200:24606

Flo
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#2

AW: Query an Gameserver

  Alt 26. Feb 2015, 12:45
Deine Ports sind falsch.

Schau in Ruhe noch einmal das PHP-Beispiel an, welches Du selbst oben gepostet hast.

Wenn Du es dann noch nicht erkannt hast, dann gib nochmals bescheid.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Flodding

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

AW: Query an Gameserver

  Alt 26. Feb 2015, 15:51
Im PHP-Code wird IP : PORT wie folgt per "echo" ausgegeben:
Code:
$addy = "$a1.$a2.$a3.$a4";
$key = $addy.":".$a5;
echo $key."\n";
Einige Zeilen zuvor werden $a2 - $a5 gefüllt:
Code:
$a2 = ord(fread($socket,1));
$a3 = ord(fread($socket,1));
$a4 = ord(fread($socket,1));
$a5 = ord(fread($socket,1))*256 + ord(fread($socket,1));
$a1 wird vorher schon auf die selbe Weise gefüllt und es wird überprüft ob "$a1 = 0" bzw. in diesem Fall "$a1 != 0" ist.

Wenn ich jetzt den OBEREN Code richtig deute, dann ist "$a5" der Port.
Also betrachte ich mir folgende Zeile genauer:
Code:
$a5 = ord(fread($socket,1))*256 + ord(fread($socket,1));
Ich versuche den Code jetzt einfach mal zu übersetzen:
Variable "a5" ist gleich der ASCII-Wert des Binärwertes der empfangenen Daten multipliziert mit 256. Zu diesem wird dann nochmal der ASCII-Wert des Binärwertes von eben addiert.

Quellen:
http://php.net/manual/de/function.ord.php
http://php.net/manual/de/function.fread.php

Wenn ich jetzt nachschaue, was "Ord" in Delphi bedeutet:
http://www.delphibasics.co.uk/RTL.asp?Name=Ord

Dort lese ich heraus, dass ich mit "Ord" in Delphi einen "Integer"-Wert aus folgenden Typen bekomme: " AnsiChar | Char | WideChar | Enumeration | Integer "

Dann schaue ich mir mal meine Typ-Definition für den Port an:
Delphi-Quellcode:
TServerListResponse = record
  ResponseHeader: Integer;
  PacketHeader: Word;
  First: Byte; // Byte
  Second: Byte; // Byte
  Third: Byte; // Byte
  Fourth: Byte; // Byte
  Port: Word; // unsigned Short
  ServerAdresses: TserverAddresses;
end;
Laut diesen Tabellen ist der Typ "Word" in C gleich der Typ "unsigned int".
ganz unten:
http://edn.embarcadero.com/article/10156#H15

ca. in der mitte:
http://stackoverflow.com/questions/1...void-parameter

Ein Blick in die Protokol Doku von Valve:
https://developer.valvesoftware.com/...Query_Protocol

Port ist in C Typ "unsigned short" und das Equivalent in Delphi dazu ist ein Typ "Char".

Eigener Code abgeändert:
Delphi-Quellcode:
TServerListResponse = record
  ResponseHeader: Integer;
  PacketHeader: Word;
  First: Byte; // Byte
  Second: Byte; // Byte
  Third: Byte; // Byte
  Fourth: Byte; // Byte
  Port: Char; // unsigned Short
  ServerAdresses: TserverAddresses;
end;
Wenn ich jetzt den Serverquery ausführe:
Delphi-Quellcode:
    if chr(response.PacketHeader) = 'fthen
      begin
        for y := 0 to 10 do
        begin
        Move(buffer[i], response.First, SizeOf(response.First)); inc(i, SizeOf(response.First));
        Move(buffer[i], response.Second, SizeOf(response.Second)); inc(i, SizeOf(response.Second));
        Move(buffer[i], response.Third, SizeOf(response.Third)); inc(i, SizeOf(response.Third));
        Move(buffer[i], response.Fourth, SizeOf(response.Fourth)); inc(i, SizeOf(response.Fourth));
        Move(buffer[i], response.Port, SizeOf(response.Port)); inc(i, SizeOf(response.Port));
        Form1.ListBox1.Items.Add((IntToStr(response.First)) + '.' +
                                 (IntToStr(response.Second)) + '.' +
                                 (IntToStr(response.Third)) + '.' +
                                 (IntToStr(response.Fourth)) + ':' +
                                 response.Port );
        Application.ProcessMessages;
        end;
      end;
    end;
Das Ergebnis ist weniger befriedigend:

Code:
121.21.210.134:ÿ
Oh da ist ja das "ÿ" !! Das kenne ich doch vom vorherigen Query!! "ÿ" war doch die von HEX zu Text umgewandelte "FF". Also würde mir eine Umwandlung zu HEX schonmal nichts bringen.
Ach... sind wir ma experimentierfreudig:
char(response.Port) ); Ergebnis:
Code:
111.105.136.134:ÿ
Herrje !!

Okay warte mal wir hatten doch auch in den vorherigen Querys "Shorts", "Bytes", "Strings" und "Words". Ersetzen wir mal die anderen Typen durch die in den gerade gefundenen Listen.

Ergebnis ist, dass mit den Typ-Definitionen von den Quellen die Querys falsche Werte zurückliefern.

Sind die Quellen falsch ? Lese ich sie einfach nur falsch?
Das kann doch nicht so schwer sein die Typen aus einer Tabelle zu übertragen und dann die jeweiligen Funktionen zur Umwandlung in einen String zur Ausgabe in einer Listbox zu finden.
Flo
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Query an Gameserver

  Alt 26. Feb 2015, 16:00
Ich verstehe nicht warum du jetzt den Port von Word (RICHTIG!) in Char umgewandelt hast..
Der Port ist wie immer eine Zahl und hat nix mit einem String zu tun.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Flodding

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

AW: Query an Gameserver

  Alt 26. Feb 2015, 16:16
Lese bitte die Tabelle am Ende dieser Seite:

http://edn.embarcadero.com/article/10156#H15

Laut dieser Tabelle ist ein "unsigned short" in C ein "Char" in Delphi.
Flo
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Query an Gameserver

  Alt 26. Feb 2015, 16:22
Laut mir ist es ein Word.
Die Tabelle von Embarcadero ist wenn nicht falsch zumindest veraltet oder/und sehr ungenau.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (26. Feb 2015 um 16:30 Uhr)
  Mit Zitat antworten Zitat
Flodding

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

AW: Query an Gameserver

  Alt 26. Feb 2015, 16:33
nagut als Word hab ichs ja auch nicht hinbekommen.
Flo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Query an Gameserver

  Alt 26. Feb 2015, 16:37
Wen interessiert es hier, was ein "unsigned short" von C übersetzt nach Delphi bedeutet?

Es interessiert doch ausschliesslich was der "unsigned short" in der Schnittstelle bedeutet. Es ist ein 16bit Wert (little endian) und den kann man einfach so in ein Word oder auch UInt16 einlesen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:12 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