Half-Life RCON Script

Habe folgendes gefunden:
das soll funktionieren , tut es zwar nicht aber vielleicht kann daraus Jemand etwas ableiten.

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;
    var $Host;
    var $Port = 27500;
    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'];
    }
}

$r = new rcon("xxx.xxx.xxx.xxx",27500,"rconpw");
$r->Auth();

echo "Authenticated\n";

//Send a request
var_dump($r->rconCommand("cvarlist"));

?>

die Funktion "Auth" sended das RCON Password.
 
Warning: fsockopen() [function.fsockopen]: php_hostconnect: connect failed in /home/www/htdocs/myacid.de/cs/rcon.class.php on line 27

Warning: fsockopen() [function.fsockopen]: unable to connect to 193.192.58.59:27500 in /home/www/htdocs/myacid.de/cs/rcon.class.php on line 27
Unable to open socket: Connection refused (111)

und wenn das @ da ist kommt nur:

Unable to open socket: Connection refused (111)

liegt vielleicht daran das das 2te Script für Half-Life 2 ist.
 
Vielleicht wurde dieses "Feature" in PHP deaktiviert?:-(
Nachtrag: Oder ne, sonst würde ja eine andere Meldung kommen.

Vielleicht ist die IP oder Port ja falsch :)
 
Zuletzt bearbeitet:
fsockopen() an sich scheint ja zu funktionieren. Nur kann halt keine Verbindung hergestellt werden. Sind sowohl IP als auch Port richtig angegeben? Laeuft die Verbindung vielleicht ueber UDP und nicht ueber TCP?
 
Wie gesagt: Installier doch mal das Script dass ich weiter oben gepostet habe.
Wenn das Funktioniert weißt du das es nicht an dem Server liegt sondern an deinem eigenen Script

Gruss,
MArc
 
Zurück