#!/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
?>
|