Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP client acknowledge (BattlEye Protokoll)

Einklappen

Neue Werbung 2019

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

  • PHP client acknowledge (BattlEye Protokoll)

    https://www.battleye.com/downloads/BERConProtocol.txt

    PHP-Code:

        $pass 
    =        "my_rcon_pw";
        
    $ip =            "12.34.56.78";
        
    $port =        2309;

        
    //

        
    $authCRC sprintf('%x'crc32(chr(255).chr(00).trim($pass)));
        
    $authCRC = array(substr($authCRC,-2,2), substr($authCRC,-4,2), substr($authCRC,-6,2), substr($authCRC,0,2));

        
    $loginMsg 'BE'.chr(hexdec($authCRC[0])).chr(hexdec($authCRC[1])).chr(hexdec($authCRC[2])).chr(hexdec($authCRC[3]));
        
    $loginMsg .= chr(hexdec('ff')).chr(hexdec('00')).trim($pass);

        
    $hbMsg 'BE'.chr(hexdec('7d')).chr(hexdec('8f')).chr(hexdec('ef')).chr(hexdec('73'));
        
    $hbMsg .= chr(hexdec('ff')).chr(hexdec('02')).chr(hexdec('00'));

        
    //

        
    $server = @fsockopen"udp://" $ip$port$errno$errstr);

        if( 
    $server === false ) throw new \Exception'Could not bind to socket: ' $errstr );

        
    //

        
    $sent fwrite$server$loginMsg );

        if( 
    $sent === false ) throw new \Exception'Failed to send login!' );

        
    $result fread$server16 );

        if( @
    ord$result[strlen$result ) - 1] ) == ) throw new \Exception'Login failed, wrong password or wrong port!' );

        
    //

        
    for(;;)
        {
            
    sleep(1);

            
    $command =    "say -1 TEST";

            
    $msgCRC sprintf('%x'crc32(chr(255).chr(01).chr(hexdec(sprintf('%01b'0))).trim($command)));
            
    $msgCRC = array(substr($msgCRC,-2,2),substr($msgCRC,-4,2),substr($msgCRC,-6,2),substr($msgCRC,0,2));

            
    $cmdHead 'BE'.chr(hexdec($msgCRC[0])).chr(hexdec($msgCRC[1])).chr(hexdec($msgCRC[2])).chr(hexdec($msgCRC[3])).chr(hexdec('ff')).chr(hexdec('01')).chr(hexdec(sprintf('%01b'0)));
            
    $cmdMsg $cmdHead.trim($command);

            
    //

            
    $cmd fwrite$server$cmdMsg );

            if( 
    $cmd === false ) throw new \Exception'Failed to send command!' );
        } 

    Sinn des Scripts ist die RCon Verbindung via. BattlEye Protokoll zum Game Server.

    An diesen wird der Command "say -1 TEST" gesendet.
    Theoretisch in einer Endlosschleife, praktisch allerdings mit Timeout.



    Nach rund 9-10 Sekunden (deshalb sleep) wurde die Verbindung
    des Clients zum Server durch den Server (laut BE Protokoll) abgebrochen.

    Nachfolgender Code (Heartbeat) wird der Schleife hinzugefügt.

    PHP-Code:
        for(;;)
        {
            if( !isset( 
    $i ) ) $i 0;

            
    sleep(1);

            
    $command =    "say -1 TEST";

            
    $msgCRC sprintf('%x'crc32(chr(255).chr(01).chr(hexdec(sprintf('%01b'0))).trim($command)));
            
    $msgCRC = array(substr($msgCRC,-2,2),substr($msgCRC,-4,2),substr($msgCRC,-6,2),substr($msgCRC,0,2));

            
    $cmdHead 'BE'.chr(hexdec($msgCRC[0])).chr(hexdec($msgCRC[1])).chr(hexdec($msgCRC[2])).chr(hexdec($msgCRC[3])).chr(hexdec('ff')).chr(hexdec('01')).chr(hexdec(sprintf('%01b'0)));
            
    $cmdMsg $cmdHead.trim($command);

            
    //

            
    $cmd fwrite$server$cmdMsg );

            if( 
    $cmd === false ) throw new \Exception'Failed to send command!' );

            
    $i++;

            
    //

            
    if( $i == )
            {
                
    $hb fwrite$server$hbMsg );

                if( 
    $hb === false ) throw new \Exception'Failed to send heartbeat!' );

                unset( 
    $i );
            }
        } 

    Etwa in der 9-10 Sekunde wird dem Server ein Heartbeat gesendet.
    Ein leeres command packet wie im BattlEye Protokoll beschrieben.


    Der Heartbeat funktioniert und der Command wird weiterhin an den Server gesendet und auch verarbeitet.


    Nach nunmehr ~ 20s, d.h. dem zweiten 10s Intervall, in dem der Client seine
    Aktivität an den Server übermitteln müsste, wird der 2. Heartbeat offenbar ignoriert.

    Er wird vom Server nicht mehr angenommen o.ä. und die Verbindung zum Client wird getrennt.


    Warum ist das so?


    Laut Protokoll ist folgendes erfasst: 999.PNG



    D.h. der Client müsste Statusnachrichten vom Server an alle Clients verifizieren.


    Wie genau ließe sich dies anhand des obrigen Codes hinzufügen, um
    prinzipiell eine persistente Verbindung zum Server zu halten können?

  • #2
    Beim Login kannst Du doch auch die Rückgabe des Servers verarbeiten.
    Boldface und fette Schriftgröße ist ja nicht besonders höflich.

    Kommentar


    • #3
      Zitat von tomBuilder Beitrag anzeigen
      Beim Login kannst Du doch auch die Rückgabe des Servers verarbeiten.
      Boldface und fette Schriftgröße ist ja nicht besonders höflich.
      In wie fern hilft mir deine persönliche Meinung bzgl. der Schriftformatierung?
      Ist das eine Art von Beitrags-Farming oder ...?

      Welche Rückgabe nach dem Login soll ich denn bearbeiten?

      Das Problem liegt darin, ankommende Pakete vom Server zu beantworten,
      der damit die Aktivität des Clients überprüft bzw. seine Statusnachrichten an
      alle Clients ausschüttet.

      Deine Antwort hat weder etwas mit dem Thema zu tun noch irgend einen Sinn...

      Kommentar


      • #4
        Vielen Dank für Deine respesktvolle höfliche Antwort.

        Kommentar


        • #5
          Zitat von 0FakE Beitrag anzeigen
          Nach nunmehr ~ 20s, d.h. dem zweiten 10s Intervall, in dem der Client seine
          Aktivität an den Server übermitteln müsste, wird der 2. Heartbeat offenbar ignoriert.

          Er wird vom Server nicht mehr angenommen o.ä. und die Verbindung zum Client wird getrennt.
          Hast du dazu vielleicht genauere Daten wie HTTP-Statuscodes, Serverlogs, Debugausgaben oder ähnliches?

          Wie führst du das Script aus?
          Vielleicht scheitert es an der max_execution_time.

          Kommentar

          Lädt...
          X