无法打开套接字,连接超时

时间:2016-02-17 12:33:06

标签: php sockets source-engine

尝试使用此代码将包从我的webhost发送到游戏服务器。但是它始终导致Unable to open socket: Connection timed out (110)广告,我无法弄清楚它为什么超时。当我在我的localhost上尝试这个时,它可以很好地工作,但是当它在webhost上时,它只是超时了。我试图将超时设置为其他东西,但它没有帮助。

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();
        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 = @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)).'"';
        $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'];
    }
}

如果我在fsockopen中指定udp连接,它不会超时,但是如果我尝试tcp,它会超时。很可能是由主持人引起的,但我不知道从哪里开始。

https://developer.valvesoftware.com/wiki/Source_RCON_Protocol https://developer.valvesoftware.com/wiki/Server_queries

0 个答案:

没有答案