A little bit of everything answered here. : tribesMSServer

HomePage :: Categories :: PageIndex :: RecentChanges :: RecentlyCommented :: Login/Register
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();
}

There are no comments on this page. [Add comment]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.2
Page was generated in 1.0537 seconds