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?
