#!/opt/php/bin/php -q <?
/*
This scripts will show the implementation of both clsDaemonize and clsTCPServer
*/
include("clsSocket.php"); include("clsDaemonize.php");
/* Various constants needed for clsTCPServer */ define('MAXLINE', 2048); // how much to read from a socket at a time define('LISTENQ', 30); // listening queue define('PORT', 10000); // the default port to run on define('FD_SETSIZE', 30); // file descriptor set size (max number of concurrent clients)...
/* Function to be called when a connection is received. */ function welcome($childSocket) { global $myDaemon; $myDaemon->writeLog("Connection established.[".$childSocket->sckRemoteAddress.":".$childSocket->sckRemotePort."]"); }
/* Function to be called when a connection is closed. */ function byebye($childSocket) { global $myDaemon; $myDaemon->writeLog("Connection closed [".$childSocket->sckRemoteAddress.":".$childSocket->sckRemotePort."]."); }
function hex2dec($hex) {
$nib=array( "0"=>0, "1"=>1, "2"=>2, "3"=>3, "4"=>4, "5"=>5, "6"=>6, "7"=>7, "8"=>8, "9"=>9, "A"=>10, "B"=>11, "C"=>12, "D"=>13, "E"=>14, "F"=>15 );
$hi1=(($nib[substr($hex,0,1)]*16)+$nib[substr($hex,1,1)])*256+(($nib[substr($hex,2,1)]*16)+$nib[substr($hex,3,1)]); return $hi1; }
/* Function to be called to handle the incoming connection */ function handle_connection($childSocket) { global $myTCPServer,$myDaemon; do { if (false === ($buf = $childSocket->read_normal(MAXLINE))) { $myDaemon->writeLog($childSocket->sckError); } if ($buf == 'shutdown') { $myTCPServer->closeAll(); $myDaemon->shutdown(); exit(0); break; } if ($buf == 'quit') { $myTCPServer->close_client($childSocket->sckIndex); break; }
$myDaemon->writeLog("Received: $buf"); $childSocket->write("$buf to you!\n"); } while (true); }
/* Signal handling for daemon. */ function sig_handler($signal) { global $myDaemon,$myTCPServer;
switch ($signal) { case SIGTERM: $myTCPServer->closeAll(); $myDaemon->shutdown(); exit(0); break; case SIGHUP: break; }
}
/* Function to be forked to when daemon starts execution */ function start() { global $myTCPServer,$myDaemon; $myDaemon->writeLog("Listening for connections"); $myTCPServer->start();
}
$myTCPServer=new clsTCPServer("192.168.1.4", PORT, FD_SETSIZE); // Create an instance of class clsTCPServer $myTCPServer->initServer(AF_INET, SOCK_STREAM, SOL_TCP, LISTENQ); // Initialization of server features. $myTCPServer->srvMaxLineLen=MAXLINE; // Sets the max length to be read from socket $myTCPServer->setInitHandler("welcome"); // Sets connection open handler to function "Welcome" $myTCPServer->setCloseHandler("byebye"); // Sets connection close handler to function "ByeBye" $myTCPServer->setConnectionHandler("handle_connection"); // Sets conenction flow handler to function "handle_connection"
$myDaemon=new clsDaemonize(); // Creates an instance of clsDaemonize $myDaemon->setup_sighandler(SIGTERM,"sig_handler"); // Sets various signal handlers $myDaemon->setup_sighandler(SIGHUP,"sig_handler"); $myDaemon->fork("start"); // Start daemonization process
?>
|