Oldest known version of this page was edited on 2007-08-07 08:50:06 by JimLucas []
Page view:
This is not complete code, but it is a work in progress.
#!/usr/local/bin/php -q
<?php
error_reporting(E_ALL);
ini_set('display_errors',
'On');
// Set time limit to indefinite execution
set_time_limit(0);
// Set the ip and port we will listen on
$IP =
'66.39.167.52';
$PORT =
28000;
$packet_size =
1024;
$timeout =
250;
$servers =
array();
define('DB_HOST',
'serv1.cmsws.com');
define('DB_USER',
'***');
define('DB_PASS',
'***');
define('DB_DB',
'master_server');
$rh =
new db_mysql
();
if ( !
$rh->
connect(DB_HOST, DB_USER, DB_PASS, DB_DB
) ) {
die("Didn't work - ".
mysql_error());
}
/* Open a server socket to port 1234 on localhost */
if ( $socket = @stream_socket_server
("udp://{$IP}:{$PORT}",
$errno,
$errstr, STREAM_SERVER_BIND
) ) {
echo "Socket setup and listening... udp://{$IP}:{$PORT}\n";
while ( true ) {
/* Get the exact same packet again, but remove it from the buffer this time. */
$raw_data = stream_socket_recvfrom
($socket,
$packet_size,
0,
$remote_ip);
# print_r( unpack('C8', $raw_data) );
list( ,
$game_type,
$request_type,
$dummy) =
unpack('C4',
$raw_data);
switch("X{$request_type}X") {
case 'X3X':
echo "Requesting server list from IP:{$remote_ip}\n";
# send_list();
echo "Completed!\n";
break;
case 'X5X':
$utime =
date('U');
echo "Heart Beat from IP:{$remote_ip} @ ".
date('c',
$utime).
"\n";
# add_server($remote_ip, $utime);
break;
default:
echo "Game request not recognized\n";
break;
}
}
fclose($socket);
} else {
echo "Socket Server Failure\n";
}
function delete_server
($remote_ip) {
echo "Deleteing {$remote_ip}\n";
global $servers;
if ( isset($server[$remote_ip]) ) {
unset($server[$remote_ip]);
}
}
function add_server
($remote_ip) {
global $rh;
$rh->
query("REPLACE INTO starsiege_tribes_master_server (ip_port, cachestamp) VALUES ('$remote_ip', NOW())");
}
function update
($remote_ip) {
global $rh;
$rh->
query("UPDATE starsiege_tribes_master_server SET cachestamp=NOW() WHERE ip_port='$remote_ip'");
}
function retrieve
() {
global $rh,
$servers;
$rh->
query("DELETE FROM starsiege_tribes_master_server WHERE cachestamp < (NOW() - 3 minutes)");
if ( $res =
$rh->
query("SELECT ip_port FROM starsiege_tribes_master_server") !==
false ) {
$servers =
array();
while ( list($server) =
$res->
fetch_row() ) {
$servers[$server] =
'';
}
}
}
function send_list
() {
global $rh,
$timeout;
$now =
date('U');
$servers = retrieve
();
foreach ( $servers AS $remote_address =>
$time ) {
stream_socket_sendto
($socket,
$entry);
}
update
();
}