Problem beim Abrufen von Daten (fread)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem beim Abrufen von Daten (fread)

    Hallo,

    ich versuche gerade mit einem Server zu komunizieren, der Rcon laufen hat (Admin Tool für Online Spiele).

    An sich funktioniert das ganze auch, ich habe nur teilweise das Problem das ich nicht alle Daten Zurück bekomme :-(

    Hier mal die Verbindung mit dem Befehl status, der eigentlich alle Spieler auf dem Server auflisten soll:

    PHP-Code:
    $server_addr "udp://85.114.140.22";
    $port 28960;
    $server_timeout 10;
    $server_rconpass "******";
    $server_extra_footer true;

    $cmd "status";

    $connect fsockopen($server_addr$port$re$errstr$server_timeout);
    $send "\xff\xff\xff\xff" 'rcon "' $server_rconpass '" '.$cmd.(($server_extra_footer)?"\n":'');
    fwrite($connect$send);
    $buffer fread($connect4096 100);
    fclose($connect);

    echo 
    $buffer
    Als Antwort bekomme ich:

    ÿÿÿÿprint
    map: mp_pk_harbor
    num score ping guid name lastmsg address qport rate
    --- ----- ---- -------------------------------- --------------- ------- --------------------- ----- -----
    4 20 35 264d3fd4ad0cc9c1a9eeda3358e7ccad |GiZ|^4 Laire^7 50 91.65.19.50:28960 -5956 25000
    5 0 CNCT 13bd9c6fe65ed3c909e883285d8f6058 [207AH]Narcist^7 1324150 84.105.45.2:28960 -22482 25000
    6 15 37 11fcb1f6ab433ef714c71c9cbfd2e8ae ^7END | SMAC^7 50 88.70.75.61:-10533 -30080 25000
    7 15 71 df1298ae1d3dbdd1b5963b1a834f5a00 BoBa KIELER II.^7 50 80.202.244.113:28960 1592 25000
    8 30 90 d251472d06db01fe0952c306b3a74e08 RaZz^7 50 84.69.210.22:28960 -19903 25000
    9 105 100 1e306891f18755c0084b41040f5ea781 |GiZ| Dantes^7 50 78.52.90.22:-2505 -4785 25000
    10 0 999 d042c15429b47787c4e3230d0f99909b END | Walki^7 4050 84.182.203.72:28960 -4562 25000
    11 0 999 186744934072355a2913972abc9fb4b2 CGC | kRiMiNaL^7 36650 71.226.198.169:28960 28740 25000
    12 35 47 6a62e7275955a6d75907cf61a997e32a xXDownfallXx^7 0 217.93.15.9:-2626 10971 25000
    13 0 39 56bc347a7933b8335efe7b4bfa397a89 XaM^7 50 79.221.232.
    Es fehlen ca. 5 Spieler und die Daten von dem letzten Spieler sind unvollständig...


    Vielleicht hat sich schon jemand damit beschäftigt oder eine Idee, was ich ausprobieren kann.

  • #2
    PHP-Code:
    $buffer fread($connect4096 100); 
    schon dran gedacht, dass das nicht in 409600 bytes passt? versuch einfach mal
    PHP-Code:
    $buffer="";
    while(
    $tmp=fread($connect128)) {
     
    $buffer.=tmp;

    Kommentar


    • #3
      Gut funktioniert, komischerweise läuft das Script jetzt 120 Sekunden, obwohl er bei der Abfrage obern nur 5 Sekunden gebruacht hat...

      Kommentar


      • #4
        Hm, kann ich jetzt irgendwie ermitteln wiviel "bytes" er abgefragt hat? vielleicht kann ich das irgendiwe noc limitieren, damit das ganze nicht so lange dauert...

        Kommentar


        • #5
          Also ohne eine Protokoll-Spezifikation wird dir da wohl niemand helfen können... und wenn du die Spezifikation hast, dann wiederum solltest du das auch selbst können

          Wahrscheinlich wird irgendwo ein "End"-Byte gesendet, was du verpasst. Und nach dem End-Byte kann man die Verbindung kappen. Da du das Byte nicht beachtest, bleibt die Verbindung solange offen bis einer der beiden Partner sie kappt.
          Wäre zumindest eine Möglichkeit. Aber wie gesagt, entweder rum probieren oder Spezifikation raus suchen.

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            Die Spezifikationen habe ich schon gesucht wie ein Wahnsinniger...

            Wenn ich genau weiß was als antwort kommt, kann ich dann nich auf anderem Weg herraus finden was als "End"-Byte gesendet wird?

            Kommentar


            • #7
              da udp ein verbindungsloses protokoll ist, wird wahrscheinlich bei dir das script so lange laufen, bis der timeout zuschlägt.

              eventuell kannst du da etwas mit stream_set_timeout() / stream_get_meta_data() drehen - bin mir aber nicht sicher, nur so als idee.

              Kommentar


              • #8
                Mal folgendes probiert?
                PHP-Code:
                while(!feof($connect)){
                  
                $buffer .= fgets($connect);
                }
                fclose($connect); 
                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                Kommentar

                Lädt...
                X