Tengo una consulta conrespecto a el tema de sockets en PHP, logro mantener "viva" la conexion gracias a una funcion recursiva:
server.php
Código PHP :
class SocketServer{ public $host; public $port; public $closed; public $event; public function __construct($vhost='127.0.0.1',$vport=2356){ if(!preg_match("/\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}/",$vhost)){ trigger_error('Invalid IP address format.',E_USER_ERROR); }else{ echo $vhost; } if(!is_int($vport)||$vport<1||$vport>65535){ trigger_error('Invalid TCP port number.',E_USER_ERROR); } $this->host=$vhost; $this->port=$vport; $this->connect(); } function connect(){ set_time_limit(0); // create low level socket if(!$socket=socket_create(AF_INET,SOCK_STREAM,0)){ trigger_error('Error creating new socket.',E_USER_ERROR); } // bind socket to TCP port if(!socket_bind($socket,$this->host,$this->port)){ trigger_error('Error binding socket to TCP port.',E_USER_ERROR); } // begin listening connections if(!socket_listen($socket)){ trigger_error('Error listening socket connections.',E_USER_ERROR); } // create communication socket if(!$comSocket=socket_accept($socket)){ trigger_error('Error creating communication socket.',E_USER_ERROR); } // read socket input $socketInput=socket_read($comSocket,1024); // convert to uppercase socket input $socketOutput=strtoupper(trim($socketInput))."n"; // write data back to socket server if(!socket_write($comSocket,$socketOutput,strlen($socketOutput))){ trigger_error('Error writing socket output',E_USER_ERROR); } // close sockets socket_close($comSocket); $this->event = $this->closeSocket($socket); } function closeSocket($sObj) { socket_close($sObj); return true; } } $loco =& new SocketServer(); keepAlive(); function keepAlive() { global $loco; if($loco->event == true) { $loco =& new SocketServer(); keepAlive(); } }
y este es:
client.php
Código PHP :
<?php // check if form was submitted if(isset($_POST['send'])){ //include_once('server.php'); // open client connection to TCP server if(!$fp=fsockopen('127.0.0.1',2356,$errstr,$errno,30)){ trigger_error('Error opening socket',E_USER_ERROR); } $message=$_POST['message']; // write message to socket server fputs($fp,$message); // get server response $ret=fgets($fp,1024); // close socket connection fclose($fp); echo '<h1>You entered the following message in lowercase :'.$ret.'</h1>'; exit(); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>TESTING TCP SOCKET SERVER</title> <meta http-equiv="Content-Type" content="text/html; charset=iso- 8859-1" /> </head> <body> <h1>Enter your message here</h1> <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> <input type="text" name="message" size="30" /><br /> <input type="submit" name="send" value="Send Value" /> </form> </body> </html>
$event en la clase dispara true una vez que la conexion del socket se cierra entonces Keep alive verifica si se "produjo" el evento de cierre y vuelve a crear otro socket y este se mantiene a la espera de datos del cliente, una vez recibido se cierra y keepAlive se ejecuta de nuevo (funcion recursiva).
Ahora dato extra, una vez ejecutas server.php en tu navegador, LO CIERRAS, y puedes enviar con client.php las veces que quieras. Puedo crear otro evento para detenerlo, pero mi pregunta es: Este script puede generar algun daño al servidor?