Delphi-PRAXiS
Seite 10 von 12   « Erste     8910 1112      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Query an Gameserver (https://www.delphipraxis.net/183987-query-gameserver.html)

Flodding 25. Feb 2015 21:02

AW: Query an Gameserver
 
Ich hatte die Definitionen ja exakt ganauso schon gepostet.

Dass es mehrere Pakete werden für die komplette Serverliste hab ich auch schon verstanden.

Ich wollte erstmal nur ein Paket "sortieren" und glaube, dass ich einfach einen falschen Query ausführe.

Als Response bekomme ich IP Adressen von Servern die nicht dem Filter entsprechen.

Das kann doch nicht an der Aufteilung der Arrays liegen :?

Damit kommen auch nur falsche Server raus.
Delphi-Quellcode:
  request.Payload[9] := $3A;
  request.Payload[10] := $00;
  request.Payload[11] := $00;

  request.Payload[12] := $30;
  request.Payload[13] := $5C;
Damit auch:
Delphi-Quellcode:
  request.Payload[9] := $3A;
  request.Payload[10] := $00;
  request.Payload[11] := $30;

  request.Payload[12] := $30;
  request.Payload[13] := $5C;

BadenPower 25. Feb 2015 21:25

AW: Query an Gameserver
 
Dein altes aus Post #88

Delphi-Quellcode:
  request.Payload[0] := $31;
  request.Payload[1] := $FF;
  request.Payload[2] := $30;
  request.Payload[3] := $2E;
  request.Payload[4] := $30;
  request.Payload[5] := $2E;
  request.Payload[6] := $30;
  request.Payload[7] := $2E;
  request.Payload[8] := $30;
  request.Payload[9] := $3A; // hier ist der Doppelpunkt
  request.Payload[10] := $00; // StringEnde
fehlende 0 also die Zahl 0

Delphi-Quellcode:
  lRequest.Payload[0] := $31;
  lRequest.Payload[1] := $FF;
  lRequest.Payload[2] := $30;
  lRequest.Payload[3] := $2E;
  lRequest.Payload[4] := $30;
  lRequest.Payload[5] := $2E;
  lRequest.Payload[6] := $30;
  lRequest.Payload[7] := $2E;
  lRequest.Payload[8] := $30;
  lRequest.Payload[9] := $3A; // hier ist der Doppelpunkt
  lRequest.Payload[10] := $30; //Port 0 hat hier gefehlt
  lRequest.Payload[11] := $00; // StringEnde
Bitte, bitte, bitte Flo. Immer alles aufmerksam lesen.
Du machst es uns wirklich nicht leicht.

Flodding 25. Feb 2015 21:52

AW: Query an Gameserver
 
Ja entschuldigung .
Es sind meisst nur Flüchtigkeitsfehler und ich mag schon garnicht mehr weiter Fragen stellen weil ich mich langsam anfange über mich selber zu ärgern und schämen. :roll:

Dieser Query sollte doch eigentlich dann richtig sein:
Delphi-Quellcode:
  request.Payload[0] := $31; // die "1"
  request.Payload[1] := $FF; // ÿ für Weltweit
  request.Payload[2] := $30; // 0
  request.Payload[3] := $2E; // .
  request.Payload[4] := $30; // 0
  request.Payload[5] := $2E; // .
  request.Payload[6] := $30; // 0
  request.Payload[7] := $2E; // .
  request.Payload[8] := $30; // 0
  request.Payload[9] := $3A; // :
  request.Payload[10] := $30; // 0
  request.Payload[11] := $00; // erstes Stringende
  request.Payload[12] := $5C; // \
  request.Payload[13] := $67; // g
  request.Payload[14] := $61; // a
  request.Payload[15] := $6D; // m
  request.Payload[16] := $65; // e
  request.Payload[17] := $64; // d
  request.Payload[18] := $69; // i
  request.Payload[19] := $72; // r
  request.Payload[20] := $5C; // \
  request.Payload[21] := $61; // a
  request.Payload[22] := $72; // r
  request.Payload[23] := $6D; // m
  request.Payload[24] := $61; // a
  request.Payload[25] := $32; // 2
  request.Payload[26] := $61; // a
  request.Payload[27] := $72; // r
  request.Payload[28] := $72; // r
  request.Payload[29] := $6F; // o
  request.Payload[30] := $77; // w
  request.Payload[31] := $70; // p
  request.Payload[32] := $63; // c
  request.Payload[33] := $00; // Ende 2ter String
Mit diesem Query kommt aber nicht das an was ich angefordert habe.:(

BadenPower 25. Feb 2015 22:33

AW: Query an Gameserver
 
Wie ist denn request.Payload deklariert?

Denn wie in Post 52 kann es ja nicht sein:
Delphi-Quellcode:
TInfoRequest = packed record
  RequestHeader: Integer;
  PacketHeader: AnsiChar;
  Payload: array[0..19] of AnsiChar;
end;

Flodding 25. Feb 2015 22:39

AW: Query an Gameserver
 
Ich habe es abgeändert um die Querys wieder Byte für Byte eingeben zu können:
Delphi-Quellcode:
TInfoRequest = packed record
  RequestHeader: array[0..3] of Byte;
  PacketHeader: array[0..0] of Byte;
  Payload: array[0..40] of Byte;
end;
Die anderen beiden Querys habe ich dementsprechend umgebaut und die funktionieren weiterhin.

BadenPower 26. Feb 2015 09:39

AW: Query an Gameserver
 
Die Syntax aus #93 ist ok und gibt die "arma2arrowpc"-Server von "FF" = "Rest der Welt" (nicht weltweit) ordnungsgemäß zurück.


Mit der Deklaration aus #95 wirst Du allerdings an Grenzen stoßen, wenn Du es dem Benutzer ermöglichen willst, die Auslese-Parameter über Dein Programm zu ändern.

Flodding 26. Feb 2015 09:52

AW: Query an Gameserver
 
Ich habe dafür ja auch einen PHP-Vorlage:
Code:
<pre>
   <?php
   /*
      Example of how to get server list from steam. Works for both Arma 2 and 3 servers
      Original Source: https://developer.valvesoftware.com/wiki/User:Pizzahut/test.php
   */
   $master_servers = array("hl2master.steampowered.com");

   define("MIN_PORT", 27010); // Range of port numbers which the master servers
   define("MAX_PORT", 27013); // potentially use.

   // define("FILTER", '\gamedir\arma3'); // A3
   define("FILTER", '\gamedir\arma2arrowpc'); // A2
   define("REGION", "\xFF"); // region = world
   define("TIMEOUT", 2.0); // 2s timeout

   function query_timeout(&$socket, $seed)
   {
      echo "Sending query to master server.\n";
      stream_set_timeout($socket, TIMEOUT);
      if (!fwrite($socket, "1".REGION."$seed\0".FILTER."\0"))
      {
         fclose($socket);
         exit("fwrite error\n");
      }
      echo "Reading response header.\n";
      stream_set_timeout($socket, TIMEOUT);
      $s = bin2hex(fread($socket, 6));
      $info = stream_get_meta_data($socket);
      if ($info['timed_out'])
         echo "Master server timed out.\n";
      else
      {
         if ($s !== "ffffffff660a")
         {
            fclose($socket);
            if ($s == "")
               echo "Expected ff ff ff ff 66 0a (hex) but got nothing.\n";
            else
               echo "Expected ff ff ff ff 66 0a (hex) but got $s.\n";
            return True;
         }
      }
      return $info['timed_out'];
   }

   // Connect to master server, return timeout info.
   // The socket is passed as reference and thus returned as well.
   function master_server_timeout(&$socket, $ip)
   {
      $port = MIN_PORT;
      do {
         echo "Connecting to master server \"$ip:$port\".\n";
         $socket = fsockopen("udp://$ip", $port, $errno, $errstr, TIMEOUT);
         if (!$socket) exit("Error $errno : $errstr \n");
         $timeout = query_timeout($socket, "0.0.0.0:0");
         $port = $port + 1;
      } while ($timeout && ($port <= MAX_PORT));
      return $timeout;
   }
   // Repeat until list isn't empty.
   do
   {
      // Try all master servers until we find one that isn't timing out.
      do
         foreach ($master_servers as $ip)
           if ($timeout=master_server_timeout($socket, $ip))
             fclose($socket);
           else
             break;
      while ($timeout);
      // Read list with server addresses (IP:port).
      $count = 0;
      $old_a1 = 0; $old_a2 = 0; $old_a3 = 0; $old_a4 = 0; $old_a5 = 0;
      $max_timeouts = 6;
      do
      {
         stream_set_timeout($socket, TIMEOUT);
         $a1 = ord(fread($socket,1));
         $info = stream_get_meta_data($socket);
         if ($info['timed_out'])
         {
           $seed = "$old_a1.$old_a2.$old_a3.$old_a4:$old_a5";
           echo "Seed: $seed\n";
           while (query_timeout($socket, $seed));
           stream_set_timeout($socket, TIMEOUT);
           $a1 = ord(fread($socket,1));
           $info = stream_get_meta_data($socket);
           if ($info['timed_out'])
           {
             echo "Timeout occured.\n";
             break;
           }
           $check_for_duplicate = 1;
         }
         else
           $check_for_duplicate = 0;
         // Let's always read the rest of the address (even if it starts with 0) in
         // order to empty the master server's write buffer. This may avoid subsequent
         // problems, but I'm paranoid here.
         $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));
         if ($a1 != 0)
         {
           if (($check_for_duplicate==0)||($a1!=$old_a1)||($a2!=$old_a2)||
           ($a3!=$old_a3)||($a4!=$old_a4)||($a5!=$old_a5))
           {
            $count++;
            //echo "$count $a1.$a2.$a3.$a4:$a5\n";
            $addy = "$a1.$a2.$a3.$a4";
            $key = $addy.":".$a5;
            echo $key."\n";
           }
           $old_a1 = $a1; $old_a2 = $a2; $old_a3 = $a3; $old_a4 = $a4; $old_a5 = $a5;
         }
      } while ($a1 != 0);
      fclose($socket);
   } while ($count == 0);
   echo "Retrieved $count server addresses.\n";
?>
</pre>
Dort wird ja im oberen Teil Filter und Region definiert:
Code:
define("FILTER", '\gamedir\arma2arrowpc'); // A2
define("REGION", "\xFF"); // region = world
Wenn ich das Script ausführe:
http://last-templers.de/a2epoch/serverlist.php (dauert etwas das Laden)

Die Ausgabe ist die, die ich im Programm haben möchte.

BadenPower 26. Feb 2015 10:51

AW: Query an Gameserver
 
Zitat:

Zitat von Flodding (Beitrag 1291584)
Die Ausgabe ist die, die ich im Programm haben möchte.

Und was geht denn ncht?


Die ersten 10 Server, welche ich über die Abfrage erhalte sind zum Beispiel:

84.191.11.101:2316
81.169.231.59:2313
85.214.238.7:27016
193.111.140.177:2311
146.0.42.124:2304
217.114.196.201:2301
85.190.173.146:2301
146.0.32.146:2301
178.254.34.206:2311
81.169.250.14:2301

Flodding 26. Feb 2015 12:03

AW: Query an Gameserver
 
So werte ich den Buffer aus:
Delphi-Quellcode:
    if chr(response.PacketHeader) = 'f' then
      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

:?

BadenPower 26. Feb 2015 12:45

AW: Query an Gameserver
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:03 Uhr.
Seite 10 von 12   « Erste     8910 1112      

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