RCon Problem

Discussion in 'Bukkit Help' started by blargh, Jun 21, 2012.

Thread Status:
Not open for further replies.
  1. Offline

    blargh

    Everytime i execute my Script this error is thrown:
    Notice: Undefined variable: ret in D:\xam\xampp\htdocs\asdf\rcon.class.php on line 125
    Notice: send of 18 bytes failed with errno=10053 I just use the Example code used by
    Actually use Bukkit latest RB without Plugins
    [WARNUNG] Debugging is enabled, performance maybe reduced!
    Rcon connection from: /127.0.0.1

    I connect but i only get:
    Show Spoiler
    <?php
    /*
    RCON remote console class, modified for minecraft compability by Tehbeard.

    !!!YOU MUST CONFIGURE RCON ON YOUR MINECRAFT SERVER FOR THIS TO WORK
    AT TIME OF WRITING ONLY 1.9pr4+ HAVE BUILTIN RCON SUPPORT!!!

    Example Code:
    ============
    include_once("rcon.class.php"); //Include this file
    $r = new rcon("127.0.0.1",25575,"foobar"); //create rcon object for server on the rcon port with a specific password
    if($r->Auth()){ //Connect and attempt to authenticate
    {
    $r->rconCommand("say Saving in 10 seconds!"); //send a command
    sleep(10);
    $r->rconCommand("save-all"); //send a command
    $r->rconCommand("say Save complete!");//send a command
    echo $r->rconCommand("list");//send a command, echo returned value
    }
    ============



    Based upon the following work:
    [<<<
    Basic CS:S Rcon class by Freman. (V1.00)
    ----------------------------------------------
    Ok, it's a completely working class now with with multi-packet responses

    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")

    Behaviour I've noticed:
    rcon is not returning the packet id.
    >>>]
    */

    define("SERVERDATA_EXECCOMMAND",2);
    define("SERVERDATA_AUTH",3);

    class RCon {
    var $Password;
    var $Host;
    var $Port = 27015;
    var $_Sock = null;
    var $_Id = 0;

    function RCon ($Host,$Port,$Password) {
    $this->Password = $Password;
    $this->Host = $Host;
    $this->Port = $Port;
    $this->_Sock = @fsockopen($this->Host,$this->Port, $errno, $errstr, 30) or die("Unable to open socket: $errstr ($errno)\n");
    $this->_Set_Timeout($this->_Sock,2,500);
    }

    function Auth () {
    $PackID = $this->_Write(SERVERDATA_AUTH,$this->Password);

    // Real response (id: -1 = failure)
    $ret = $this->_PacketRead();
    //var_dump($ret);
    if ($ret[0]['ID'] == -1) {
    return false;
    }
    return true;
    }

    function _Set_Timeout(&$res,$s,$m=0) {
    if (version_compare(phpversion(),'4.3.0','<')) {
    return socket_set_timeout($res,$s,$m);
    }
    return stream_set_timeout($res,$s,$m);
    }

    function _Write($cmd, $s1='', $s2='') {
    // Get and increment the packet id
    $id = ++$this->_Id;

    // Put our packet together
    $data = pack("VV",$id,$cmd).$s1.chr(0).$s2.chr(0);

    // Prefix the packet size
    $data = pack("V",strlen($data)).$data;

    // Send packet
    fwrite($this->_Sock,$data,strlen($data));

    // In case we want it later we'll return the packet id
    return $id;
    }

    function _PacketRead() {
    //Declare the return array
    $retarray = array();
    //Fetch the packet size
    while ($size = @fread($this->_Sock,4)) {
    $size = unpack('V1Size',$size);
    //Work around valve breaking the protocol
    if ($size["Size"] > 4096) {
    //pad with 8 nulls
    $packet = "\x00\x00\x00\x00\x00\x00\x00\x00".fread($this->_Sock,4096);
    } else {
    //Read the packet back
    $packet = fread($this->_Sock,$size["Size"]);
    }
    array_push($retarray,unpack("V1ID/V1Response/a*S1/a*S2",$packet));
    }
    return $retarray;
    }

    function Read() {
    $Packets = $this->_PacketRead();

    foreach($Packets as $pack) {
    if (isset($ret[$pack['ID']])) {
    $ret[$pack['ID']]['S1'] .= $pack['S1'];
    $ret[$pack['ID']]['S2'] .= $pack['S1'];
    } else {
    $ret[$pack['ID']] = array(
    'Response' => $pack['Response'],
    'S1' => $pack['S1'],
    'S2' =>$pack['S2'],
    );
    }
    }
    return $ret;
    }

    function sendCommand($Command) {
    //$Command = '"'.trim(str_replace(' ','" "', $Command)).'"';
    //$Command="stop";
    $this->_Write(SERVERDATA_EXECCOMMAND,$Command,'');
    }

    function rconCommand($Command) {
    $this->sendcommand($Command);

    $ret = $this->Read();

    //ATM: Source servers don't return the request id, but if they fix this the code below should read as
    // return $ret[$this->_Id]['S1'];
    return $ret[$this->_Id]['S1'];
    }
    }
    ?>
     
  2. Offline

    gman_ftw

  3. Offline

    blargh

    gman_ftw I dont need a Client. I just wonder, why i cant use my php code to send a command to the Server. Basically i need this for Webserver not for my Computer.
     
  4. Offline

    DingoNV

    I have the same issue blargh... the rcon.class.php examples work fine on a vanilla server for me, but they do not work in Craftbukkit, with or without plugins. Seems like the only part that works is the connect and auth, which show up in my server logs, but i get nothing when i send a command.
     
  5. Offline

    blargh

    Just patch on beta build and it works. Bukkit 'fixbugged' in latest rb.
     
  6. Offline

    DingoNV

    Thanks Blargh!
     
Thread Status:
Not open for further replies.

Share This Page