Rcon error 111

Discussion in 'Bukkit Help' started by erimen, Apr 8, 2014.

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

    erimen

    Hi,

    I try to send commands to my Minecraft server via my website.
    The web server and the Minecraft server is hosted on the same machine and it is a dedicated server so full access.
    Rcon port is 25566 and I have set a password which I will define as "passwd" here.
    So I found two files by searching on the net but I get an error: "Unable to open socket: Connection refused (111)"
    Here are the contents of files:



    PHP:
    <?php
     
        
    include_once("rcon.php");
     
     
     
        
    // Extend the rcon class to tweak it for minecraft.
     
        
    class minecraftRcon extends rcon{
     
            function 
    mcSendCommand($Command){
     
                
    $this->_Write(SERVERDATA_EXECCOMMAND,$Command,'');
     
            }
     
            function 
    mcRconCommand($Command){
     
                
    $this->mcSendcommand($Command);
     
                
    $ret $this->Read();
     
                return 
    $ret[$this->_Id]['S1'];
     
            }
     
        }
     
     
     
        
    // Server connection varialbes
     
        
    $server "localhost";
     
        
    $rconPort 25566;
     
        
    $rconPass "passwd";
     
     
     
        
    // Connect to the server
     
        
    $r = new minecraftRcon($server$rconPort$rconPass);
     
     
     
        
    // Authenticate, and if so, execute command(s)
     
        
    if ( $r->Auth() ) {
     
            echo 
    "Authenticated !<br>";
     
     
     
            
    // Send a command
     
            
    var_dump($r->mcRconCommand('say Ca marche !'));
     
        }else{
     
            echo 
    "Authentification failed !<br>";
     
        }
     
    ?>

    rcon.php :
    PHP:
    <?php
    /*
        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 "passwd";
        var 
    $Host "127.0.0.1";
        var 
    $Port 25566;
        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$errstr30) 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();
            if (
    $ret[1]['id'] == -1) {
                die(
    "Authentication Failure\n");
            }
        }
     
        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 = [USER=90736681]Fread[/USER]($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)).'"';
            
    $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[0]['S1'];
        }
    }
    ?>
    So, if you need more information do not hesitate to ask ;)

    And thanks to those who already take the trouble to look into my problem :)
    And special thanks to Google Translate :D (I French)

    In server.properties I have :
    Code:
    enable-rcon=true
    rcon.port=25566
    rcon.password=mdp

    And ports are open :
    Code:
    iptables -A INPUT -v -p TCP --dport 25566 -j ACCEPT
    iptables -A INPUT -v -p UDP --dport 25566 -j ACCEPT
    iptables -A OUTPUT -v -p TCP --dport 25566 -j ACCEPT
    iptables -A OUTPUT -v -p UDP --dport 25566 -j ACCEPT
    I note that it is not necessary to use these scripts, if you find any others, it also works :)

    Problem solved. See http://fr.openclassrooms.com/forum/sujet/erreur-rcon-111?page=1#message-85616454

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 7, 2016
Thread Status:
Not open for further replies.

Share This Page