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
Antwort Antwort
Seite 10 von 12   « Erste     8910 1112      
Flodding

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

AW: Query an Gameserver

  Alt 25. Feb 2015, 22:02
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;
Flo

Geändert von Flodding (25. Feb 2015 um 22:05 Uhr)
  Mit Zitat antworten Zitat
BadenPower

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

AW: Query an Gameserver

  Alt 25. Feb 2015, 22:25
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.
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.

Geändert von BadenPower (25. Feb 2015 um 22:28 Uhr)
  Mit Zitat antworten Zitat
Flodding

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

AW: Query an Gameserver

  Alt 25. Feb 2015, 22:52
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.

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.
Flo
  Mit Zitat antworten Zitat
BadenPower

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

AW: Query an Gameserver

  Alt 25. Feb 2015, 23:33
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;
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
 
#95

AW: Query an Gameserver

  Alt 25. Feb 2015, 23:39
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.
Flo
  Mit Zitat antworten Zitat
BadenPower

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

AW: Query an Gameserver

  Alt 26. Feb 2015, 10:39
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.
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
 
#97

AW: Query an Gameserver

  Alt 26. Feb 2015, 10:52
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.
Flo
  Mit Zitat antworten Zitat
BadenPower

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

AW: Query an Gameserver

  Alt 26. Feb 2015, 11:51
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
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
 
#99

AW: Query an Gameserver

  Alt 26. Feb 2015, 13: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
 
#100

AW: Query an Gameserver

  Alt 26. Feb 2015, 13: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
Antwort Antwort
Seite 10 von 12   « Erste     8910 1112      

 

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 13:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz