Minecraft + RCon + PHP = Hilfe?!

Dieses Thema im Forum "Programmierung" wurde erstellt von mmaarrkkuuss, 2. April 2014.

  1. mmaarrkkuuss
    Offline

    mmaarrkkuuss

    Registriert seit:
    18. Dezember 2013
    Beiträge:
    22
    Minecraft:
    WolverinGER
    Hallo,
    Ich habe versucht mit PHP und R-Con eine Verbindung zu meinem Server aufzubauen.
    Dis hat leider nicht gelappt da PHP den Code nicht versteht.
    (Server: Bukkit 1.7.4)
    PHP:
    1. <?php
    2. include_once("rcon.class.php");
    3. $host = "XXX.XXX.XXX.XXX"; // Server IP
    4. $port = "25555";                      // R-Con Port
    5. $password = "XXXXXXXXX"; // R-Con Passwort
    6. $timeout = "3";                      // Timeout
    7. $rcon = new Rcon($host, $port, $password);
    8. echo "hi1";
    9. if ($rcon->connect())
    10. {
    11.   echo "hi";
    12.   $rcon->send_command("say Hello World!");
    13. }
    Wenn ich "$rcon = new Rcon($host, $port, $password);" ausnehme lädt zwar die Seite aber ich habe keine R-Con Verbindung. Wo ist das Problem?!
     
    #1
  2. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    Ist es ein fertiges rcon Script? Wenn ja ist es das richtige? Musste selbst mehrere probieren bis eines ging.

    Hast du Rcon Aktiviert auf deinem Server in der server.properties? Und das Rcon Passwort angelegt dort drin?
     
    #2
  3. mmaarrkkuuss
    Offline

    mmaarrkkuuss

    Registriert seit:
    18. Dezember 2013
    Beiträge:
    22
    Minecraft:
    WolverinGER
    Ich habe massenhaft Probiert. Und ja ich habe R-Con auf Server angestellt passi gesetzt und Port....
     
    #3
  4. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    include der rcon.php vergessen?
     
    #4
  5. mmaarrkkuuss
    Offline

    mmaarrkkuuss

    Registriert seit:
    18. Dezember 2013
    Beiträge:
    22
    Minecraft:
    WolverinGER
    ? Was meinst du?
    Du meinst die R-Con.class.php?
     
    #5
  6. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    Edit : Genau die aus deinem Edit.

    PHP:
    1. <?php
    2. include_once("(pfad zu deiner rcon class datei).php");
    3.  
    4. $host = "XXX.XXX.XXX.XXX"; // Server IP
    5. $port = "25555";                      // R-Con Port
    6. $password = "XXXXXXXXX"; // R-Con Passwort
    7. $timeout = "3";                      // Timeout
    8. $rcon = new Rcon($host, $port, $password);
    9. echo "hi1";
    10. if ($rcon->connect())
    11. {
    12.   echo "hi";
    13.   $rcon->send_command("say Hello World!");
    14. }
    Irgendwoher muss er ja die Class kennen erst einmal.
     
    #6
  7. mmaarrkkuuss
    Offline

    mmaarrkkuuss

    Registriert seit:
    18. Dezember 2013
    Beiträge:
    22
    Minecraft:
    WolverinGER
    geht immer noch nicht (Code von der Class)
    PHP:
    1. <?php
    2. /*
    3.     Basic CS:S Rcon class by Freman.  (V1.00)
    4.     ----------------------------------------------
    5.     Ok, it's a completely working class now with with multi-packet responses
    6.  
    7.     Contact: printf("%s%s%s%s%s%s%s%s%s%d%s%s%s","rc","on",chr(46),"cl","ass",chr(64),"pri","ya",chr(46),2,"y",chr(46),"net")
    8.  
    9.     Behaviour I've noticed:
    10.         rcon is not returning the packet id.
    11. */
    12.  
    13. define("SERVERDATA_EXECCOMMAND",2);
    14. define("SERVERDATA_AUTH",3);
    15.  
    16. class RCon {
    17.     var $Password;
    18.     var $Host;
    19.     var $Port = 25555;
    20.     var $_Sock = null;
    21.     var $_Id = 0;
    22.  
    23.     function RCon ($Host,$Port,$Password) {
    24.         $this->Password = $Password;
    25.         $this->Host = $Host;
    26.         $this->Port = $Port;
    27.         $this->_Sock = @fsockopen($this->Host,$this->Port, $errno, $errstr, 30) or
    28.                 die("Unable to open socket: $errstr ($errno)\n");
    29.         $this->_Set_Timeout($this->_Sock,2,500);
    30.         }
    31.  
    32.     function Auth () {
    33.         $PackID = $this->_Write(SERVERDATA_AUTH,$this->Password);
    34.  
    35.         // Real response (id: -1 = failure)
    36.         $ret = $this->_PacketRead();
    37.         if ($ret[1]['id'] == -1) {
    38.             die("Authentication Failure\n");
    39.         }
    40.     }
    41.  
    42.     function _Set_Timeout(&$res,$s,$m=0) {
    43.         if (version_compare(phpversion(),'4.3.0','<')) {
    44.             return socket_set_timeout($res,$s,$m);
    45.         }
    46.         return stream_set_timeout($res,$s,$m);
    47.     }
    48.  
    49.     function _Write($cmd, $s1='', $s2='') {
    50.         // Get and increment the packet id
    51.         $id = ++$this->_Id;
    52.  
    53.         // Put our packet together
    54.         $data = pack("VV",$id,$cmd).$s1.chr(0).$s2.chr(0);
    55.  
    56.         // Prefix the packet size
    57.         $data = pack("V",strlen($data)).$data;
    58.  
    59.         // Send packet
    60.         fwrite($this->_Sock,$data,strlen($data));
    61.  
    62.         // In case we want it later we'll return the packet id
    63.         return $id;
    64.     }
    65.  
    66.     function _PacketRead() {
    67.         //Declare the return array
    68.         $retarray = array();
    69.         //Fetch the packet size
    70.         while ($size = @fread($this->_Sock,4)) {
    71.             $size = unpack('V1Size',$size);
    72.             //Work around valve breaking the protocol
    73.             if ($size["Size"] > 4096) {
    74.                 //pad with 8 nulls
    75.                 $packet = "\x00\x00\x00\x00\x00\x00\x00\x00".fread($this->_Sock,4096);
    76.             } else {
    77.                 //Read the packet back
    78.                 $packet = fread($this->_Sock,$size["Size"]);
    79.             }
    80.             array_push($retarray,unpack("V1ID/V1Response/a*S1/a*S2",$packet));
    81.         }
    82.         return $retarray;
    83.     }
    84.  
    85.     function Read() {
    86.         $Packets = $this->_PacketRead();
    87.  
    88.         foreach($Packets as $pack) {
    89.             if (isset($ret[$pack['ID']])) {
    90.                 $ret[$pack['ID']]['S1'] .= $pack['S1'];
    91.                 $ret[$pack['ID']]['S2'] .= $pack['S1'];
    92.             } else {
    93.                 $ret[$pack['ID']] = array(
    94.                     'Response' => $pack['Response'],
    95.                     'S1' => $pack['S1'],
    96.                     'S2' =>    $pack['S2'],
    97.                 );
    98.             }
    99.         }
    100.         return $ret;
    101.     }
    102.  
    103.     function sendCommand($Command) {
    104.         $Command = '"'.trim(str_replace(' ','" "', $Command)).'"';
    105.         $this->_Write(SERVERDATA_EXECCOMMAND,$Command,'');
    106.     }
    107.  
    108.     function rconCommand($Command) {
    109.         $this->sendcommand($Command);
    110.  
    111.         $ret = $this->Read();
    112.  
    113.         //ATM: Source servers don't return the request id, but if they fix this the code below should read as
    114.         // return $ret[$this->_Id]['S1'];
    115.         return $ret[0]['S1'];
    116.     }
    117. }
    118. ?>
     
    #7
  8. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    Das ist doch für CounterStrike Source wenn ich das richtig lese oben oO

    Probier das mal :

    PHP:
    1. <?php
    2.  
    3. class MinecraftRconException extends Exception
    4. {
    5.     // Exception thrown by MinecraftRcon class
    6. }
    7.  
    8. class MinecraftRcon
    9. {
    10.     /*
    11.      * Class written by xPaw
    12.      *
    13.      * Website: http://xpaw.ru
    14.      * GitHub: https://github.com/xPaw/PHP-Minecraft-Query
    15.      *
    16.      * Protocol: https://developer.valvesoftware.com/wiki/Source_RCON_Protocol
    17.      */
    18.    
    19.     // Sending
    20.     const SERVERDATA_EXECCOMMAND    = 2;
    21.     const SERVERDATA_AUTH           = 3;
    22.    
    23.     // Receiving
    24.     const SERVERDATA_RESPONSE_VALUE = 0;
    25.     const SERVERDATA_AUTH_RESPONSE  = 2;
    26.    
    27.     private $Socket;
    28.     private $RequestId;
    29.    
    30.     public function __destruct( )
    31.     {
    32.         $this->Disconnect( );
    33.     }
    34.    
    35.     public function Connect( $Ip, $Port = 25575, $Password, $Timeout = 3 )
    36.     {
    37.         $this->RequestId = 0;
    38.        
    39.         if( $this->Socket = FSockOpen( $Ip, (int)$Port ) )
    40.         {
    41.             Socket_Set_TimeOut( $this->Socket, $Timeout );
    42.            
    43.             if( !$this->Auth( $Password ) )
    44.             {
    45.                 $this->Disconnect( );
    46.                
    47.                 throw new MinecraftRconException( "Authorization failed." );
    48.             }
    49.         }
    50.         else
    51.         {
    52.             throw new MinecraftRconException( "Can't open socket." );
    53.         }
    54.     }
    55.  
    56.     public function isConnected( )
    57.     {
    58.         if( $this->Socket )
    59.         {
    60.             return true;
    61.         }
    62.         return false;
    63.     }
    64.    
    65.     public function Disconnect( )
    66.     {
    67.         if( $this->Socket )
    68.         {
    69.             FClose( $this->Socket );
    70.            
    71.             $this->Socket = null;
    72.         }
    73.     }
    74.    
    75.     public function Command( $String )
    76.     {
    77.         if( !$this->WriteData( self :: SERVERDATA_EXECCOMMAND, $String ) )
    78.         {
    79.             return false;
    80.         }
    81.        
    82.         $Data = $this->ReadData( );
    83.        
    84.         if( $Data[ 'RequestId' ] < 1 || $Data[ 'Response' ] != self :: SERVERDATA_RESPONSE_VALUE )
    85.         {
    86.             return false;
    87.         }
    88.        
    89.         return $Data[ 'String' ];
    90.     }
    91.    
    92.     private function Auth( $Password )
    93.     {
    94.         if( !$this->WriteData( self :: SERVERDATA_AUTH, $Password ) )
    95.         {
    96.             return false;
    97.         }
    98.        
    99.         $Data = $this->ReadData( );
    100.        
    101.         return $Data[ 'RequestId' ] > -1 && $Data[ 'Response' ] == self :: SERVERDATA_AUTH_RESPONSE;
    102.     }
    103.    
    104.     private function ReadData( )
    105.     {
    106.         $Packet = Array( );
    107.        
    108.         $Size = FRead( $this->Socket, 4 );
    109.         $Size = UnPack( 'V1Size', $Size );
    110.         $Size = $Size[ 'Size' ];
    111.        
    112.         // TODO: Add multiple packets (Source)
    113.        
    114.         $Packet = FRead( $this->Socket, $Size );
    115.         $Packet = UnPack( 'V1RequestId/V1Response/a*String/a*String2', $Packet );
    116.        
    117.         return $Packet;
    118.     }
    119.    
    120.     private function WriteData( $Command, $String = "" )
    121.     {
    122.         // Pack the packet together
    123.         $Data = Pack( 'VV', $this->RequestId++, $Command ) . $String . "\x00\x00\x00";
    124.        
    125.         // Prepend packet length
    126.         $Data = Pack( 'V', StrLen( $Data ) ) . $Data;
    127.        
    128.         $Length = StrLen( $Data );
    129.        
    130.         return $Length === FWrite( $this->Socket, $Data, $Length );
    131.     }
    132. }
    133.  
    134. ?>
    PHP:
    1.  
    2. <?php
    3. $host = "XXX.XXX.XXX.XXX"; // Server IP
    4. $port = "25555";                      // R-Con Port
    5. $password = "XXXXXXXXX"; // R-Con Passwort
    6. $timeout = "3";
    7.  
    8. $query = new MinecraftRcon();
    9. $query = $query->Connect( $host, $port, $password, $timeout);
    10. if($query->isConnected()) {
    11.   $query->Command("say Hallo Welt!!!");
    12.   echo "Befehl ist raus";
    13. } else {
    14.   echo "Fehler , keine Verbindung zum Server vorhanden.";
    15. }
    16. ?>
    17.  
     
    #8
  9. mmaarrkkuuss
    Offline

    mmaarrkkuuss

    Registriert seit:
    18. Dezember 2013
    Beiträge:
    22
    Minecraft:
    WolverinGER
    Man ist mir das mit CS Peinlich.
    Funktioniert aber Trotzdem noch nicht :/
     
    #9
  10. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    Hoffe du hast den Include Eintrag noch mit rein gesetzt welcher im Code bei mir fehlt oben.

    Welche Server version verwendest du? Und ist es Bukkit/Spigot oder BungeeCord?
     
    #10
  11. mmaarrkkuuss
    Offline

    mmaarrkkuuss

    Registriert seit:
    18. Dezember 2013
    Beiträge:
    22
    Minecraft:
    WolverinGER
    Bukkit
    Na klar ich bin doch nicht Blöd! (Kaufe bei Mediamarkt ein^^)
    Ne mal im ernst: Ich habe das mit dem Include gemacht
     
    #11