2011-06-13

Creando servicios de red TCP con PHP y xinetd

Introducción

No todo en PHP es Web y HTTP. Podemos usar PHP para muchas otras cosas. Por ejemplo podemos crear de una forma muy sencilla servicios de red. Cuando creamos servicios de red necesitamos obviamente un servidor de red (bien sea TCP o UDP).
Cuando trabajamos con Web y HTTP este servidor suele ser Apache (o similares), pero si queremos crear un servicio específico (no HTTP), además del servicio de red que queramos crear, necesitaríamos crear un servidor.
No todo en PHP es Web y HTTP. Podemos usar PHP para muchas otras cosas. Por ejemplo podemos crear de una forma muy sencilla servicios de red.
Esto lo podemos hacer con C, Java e incluso con PHP, pero cuando trabajamos en entornos Linux existe un daemon que nos permite desplegar servicios de red de una forma muy sencilla, encargándose de la parte del servidor y dejándonos a nosotros la parte del servicio de red. Este daemon es xinetd.
Vamos a ver cómo crear un sencillo servicio de red TCP con xinetd y PHP… ¡Empecemos!

Creando el servicio de red TCP con Xinetd y PHP

El ejemplo que vamos a realizar escuchará del puerto 69321, e inicialmente dirá “Hola” cuando alguien realice una petición TCP a dicho puerto. El script del ejemplo es sumamente complicado:
  1. // /home/gonzalo/tests/test1.php  
  2. echo "HELLO\n";  
Bien. Ahora lo que queremos es que nuestro servicio de red escuche el puerto tcp 60321. Para esto tenemos que definir en nuestro archivo /etc/services el puerto en cuestión:
  1. // /etc/services  
  2. ...  
  3. myService   60321/tcp # my hello service  
Y finalmente creamos la configuración en el daemon xinetd. Para ello creamos el archivo /etc/xinetd.d/myService:
  1. # default: on  
  2. # description: my test service  
  3.   
  4. service myService  
  5. {  
  6.         socket_type = stream  
  7.         protocol = tcp  
  8.         wait = no  
  9.         user = gonzalo  
  10.         server = /usr/local/bin/php-cli  
  11.         server_args = /home/gonzalo/tests/test1.php  
  12.         log_on_success += DURATION  
  13.         nice = 10  
  14.         disable = no  
  15. }  
Reiniciamos el daemon para que lea la nueva configuración del servicio que hemos creado:
  1. sudo /etc/init.d/xinetd restart  
Y listo. Ya tenemos nuestro servicio de red operativo y funcionando. Para probarlo podemos usar un simple telnet al puerto definido:
  1. telnet localhost 60321  
  2. Trying ::1...  
  3. Trying 127.0.0.1...  
  4. Connected to localhost.  
  5. Escape character is '^]'.  
  6. Hola  
  7. Connection closed by foreign host.  
¿Fácil, no? Sí pero útil, no mucho. Por esto vamos a cambiar un poco es script para que acepte variables de entrada. Esto no es HTTP por lo que no podemos usar las típicas variables $_POST y $_GET.
Lo que tenemos que hacer es leer del stdin. En PHP, al igual que con otros lenguajes, esto es muy sencillo:
  1. $handle = fopen('php://stdin','r');  
  2. $input = fgets($handle);  
  3. fclose($handle);  
  4.   
  5. echo "Hola {$input}";  
Reiniciamos el xinetd y tenemos nuestro servicio listo
  1. telnet localhost 60321  
  2. Trying ::1...  
  3. Trying 127.0.0.1...  
  4. Connected to localhost.  
  5. Escape character is '^]'.  
Vemos que el telnet se nos quedará a la espera que introduzcamos un texto. Escribimos: “gonzalo” y obtenemos:
  1. gonzalo  
  2. Hola gonzalo  
  3. Connection closed by foreign host.  

Conclusión

Y esto es todo. Con este sencillo script vemos que, si bien PHP es un lenguaje destinado principalmente para el desarrollo Web, podemos usarlo para otras cosas, manteniendo su punto fuerte: la sencillez.
¿Para qué nos puede servir esto? Bueno. Para empezar nos sirve para leer datos de dispositivos de red que tengamos por ahi, como báculas, lectores de tarjetas, sensores… Muchos de estos dispositivos suelen permitirnos en su configuración establecer una IP/puerto a la que van a enviar información en forma de trama TCP.
También podemos usarlo para comunicar procesos de una manera simple, sin necesidad de meternos con servidores XMLRPC/Soap y demás. En fin que es una herramienta más que tenemos a nuestra disposición para afrontar nuestros desarrollos.

Fuente: Link

2 comentarios:

J dijo...

Que bueno!

Como se podría hacer algo equivalente en Windows?

J dijo...

Que bueno!

Cómo se podría hacer algo similar en Windows con un Xampp?

Saludos.