https://www.battleye.com/downloads/BERConProtocol.txt
Sinn des Scripts ist die RCon Verbindung via. BattlEye Protokoll zum Game Server.
An diesen wird der Command "say -1 TEST" gesendet.
Theoretisch in einer Endlosschleife, praktisch allerdings mit Timeout.
Nach rund 9-10 Sekunden (deshalb sleep) wurde die Verbindung
des Clients zum Server durch den Server (laut BE Protokoll) abgebrochen.
Nachfolgender Code (Heartbeat) wird der Schleife hinzugefügt.
Etwa in der 9-10 Sekunde wird dem Server ein Heartbeat gesendet.
Ein leeres command packet wie im BattlEye Protokoll beschrieben.
Der Heartbeat funktioniert und der Command wird weiterhin an den Server gesendet und auch verarbeitet.
Nach nunmehr ~ 20s, d.h. dem zweiten 10s Intervall, in dem der Client seine
Aktivität an den Server übermitteln müsste, wird der 2. Heartbeat offenbar ignoriert.
Er wird vom Server nicht mehr angenommen o.ä. und die Verbindung zum Client wird getrennt.
Warum ist das so?
Laut Protokoll ist folgendes erfasst: 999.PNG
D.h. der Client müsste Statusnachrichten vom Server an alle Clients verifizieren.
Wie genau ließe sich dies anhand des obrigen Codes hinzufügen, um
prinzipiell eine persistente Verbindung zum Server zu halten können?
PHP-Code:
$pass = "my_rcon_pw";
$ip = "12.34.56.78";
$port = 2309;
//
$authCRC = sprintf('%x', crc32(chr(255).chr(00).trim($pass)));
$authCRC = array(substr($authCRC,-2,2), substr($authCRC,-4,2), substr($authCRC,-6,2), substr($authCRC,0,2));
$loginMsg = 'BE'.chr(hexdec($authCRC[0])).chr(hexdec($authCRC[1])).chr(hexdec($authCRC[2])).chr(hexdec($authCRC[3]));
$loginMsg .= chr(hexdec('ff')).chr(hexdec('00')).trim($pass);
$hbMsg = 'BE'.chr(hexdec('7d')).chr(hexdec('8f')).chr(hexdec('ef')).chr(hexdec('73'));
$hbMsg .= chr(hexdec('ff')).chr(hexdec('02')).chr(hexdec('00'));
//
$server = @fsockopen( "udp://" . $ip, $port, $errno, $errstr, 1 );
if( $server === false ) throw new \Exception( 'Could not bind to socket: ' . $errstr );
//
$sent = fwrite( $server, $loginMsg );
if( $sent === false ) throw new \Exception( 'Failed to send login!' );
$result = fread( $server, 16 );
if( @ord( $result[strlen( $result ) - 1] ) == 0 ) throw new \Exception( 'Login failed, wrong password or wrong port!' );
//
for(;;)
{
sleep(1);
$command = "say -1 TEST";
$msgCRC = sprintf('%x', crc32(chr(255).chr(01).chr(hexdec(sprintf('%01b', 0))).trim($command)));
$msgCRC = array(substr($msgCRC,-2,2),substr($msgCRC,-4,2),substr($msgCRC,-6,2),substr($msgCRC,0,2));
$cmdHead = 'BE'.chr(hexdec($msgCRC[0])).chr(hexdec($msgCRC[1])).chr(hexdec($msgCRC[2])).chr(hexdec($msgCRC[3])).chr(hexdec('ff')).chr(hexdec('01')).chr(hexdec(sprintf('%01b', 0)));
$cmdMsg = $cmdHead.trim($command);
//
$cmd = fwrite( $server, $cmdMsg );
if( $cmd === false ) throw new \Exception( 'Failed to send command!' );
}
Sinn des Scripts ist die RCon Verbindung via. BattlEye Protokoll zum Game Server.
An diesen wird der Command "say -1 TEST" gesendet.
Theoretisch in einer Endlosschleife, praktisch allerdings mit Timeout.
Nach rund 9-10 Sekunden (deshalb sleep) wurde die Verbindung
des Clients zum Server durch den Server (laut BE Protokoll) abgebrochen.
Nachfolgender Code (Heartbeat) wird der Schleife hinzugefügt.
PHP-Code:
for(;;)
{
if( !isset( $i ) ) $i = 0;
sleep(1);
$command = "say -1 TEST";
$msgCRC = sprintf('%x', crc32(chr(255).chr(01).chr(hexdec(sprintf('%01b', 0))).trim($command)));
$msgCRC = array(substr($msgCRC,-2,2),substr($msgCRC,-4,2),substr($msgCRC,-6,2),substr($msgCRC,0,2));
$cmdHead = 'BE'.chr(hexdec($msgCRC[0])).chr(hexdec($msgCRC[1])).chr(hexdec($msgCRC[2])).chr(hexdec($msgCRC[3])).chr(hexdec('ff')).chr(hexdec('01')).chr(hexdec(sprintf('%01b', 0)));
$cmdMsg = $cmdHead.trim($command);
//
$cmd = fwrite( $server, $cmdMsg );
if( $cmd === false ) throw new \Exception( 'Failed to send command!' );
$i++;
//
if( $i == 9 )
{
$hb = fwrite( $server, $hbMsg );
if( $hb === false ) throw new \Exception( 'Failed to send heartbeat!' );
unset( $i );
}
}
Etwa in der 9-10 Sekunde wird dem Server ein Heartbeat gesendet.
Ein leeres command packet wie im BattlEye Protokoll beschrieben.
Der Heartbeat funktioniert und der Command wird weiterhin an den Server gesendet und auch verarbeitet.
Nach nunmehr ~ 20s, d.h. dem zweiten 10s Intervall, in dem der Client seine
Aktivität an den Server übermitteln müsste, wird der 2. Heartbeat offenbar ignoriert.
Er wird vom Server nicht mehr angenommen o.ä. und die Verbindung zum Client wird getrennt.
Warum ist das so?
Laut Protokoll ist folgendes erfasst: 999.PNG
D.h. der Client müsste Statusnachrichten vom Server an alle Clients verifizieren.
Wie genau ließe sich dies anhand des obrigen Codes hinzufügen, um
prinzipiell eine persistente Verbindung zum Server zu halten können?
Kommentar