Programación para redes y concurrencia (III)

Luego de que en la entrega anterior complicáramos un poco las cosas introduciendo concurrencia en el servidor, un amigo me hizo notar que quizás sería mejor dar un ejemplo un tanto más «real» de lo que estábamos haciendo.

Es por eso que dejaremos por un rato el camino planificado para jugar un poco explorando las posibilidades con un cliente en PHP (en una especie de «recreo«).

Entregas anteriores

  • Primera parte: Planteo del problema, implementación de un servidor secuencial y de un cliente simple.
  • Segunda parte: Implementación de un servidor concurrente mediante procesos y mediante threads.

Nota del 19/11/2006: Ahora puede descargar el tutorial completo.

Monitoreo remoto de servidores

Si bien el servicio que hemos diseñado en las entregas anteriores (I y II) es muy limitado (después de todo, es sólo un ejemplo para desarrollar los temas), podemos utilizarlo para realizar un pequeño sistema de monitoreo remoto.

Supongamos que tenemos el servidor corriendo en varios servidores físicos distintos. Vamos a construir un programa PHP (para satisfacer los deseos de quienes querían ver algo en este lenguaje) que nos permita conectarnos a cualquiera de los servidores y ver la hora del sistema y los usuarios activos.

Recordemos que esto es sólo un ejemplo simple, por lo cual no tendremos en cuenta la seguridad del sistema. (Además, ¡estamos de recreo!).

El uso de sockets en PHP es un poco más complejo que en Perl, por lo cual nos conviene definir funciones auxiliares para establecer la conexión, leer y escribir:

Funciones de sockets

Los sockets en PHP son genéricos. Por esto debemos indicar que usaremos direccionamiento IP (AF_INET), que realizaremos una comunicación bidireccional (SOCK_STREAM) y que usaremos el protocolo TCP (SOL_TCP). Al leer de un socket debemos indicar cuál es la longitud máxima (asumimos 1024). PHP_NORMAL_READ significa que lo leído deberá interpretarse como texto. Al escribir, debemos proporcionar la longitud de la salida.

El programa se conectará al servidor especificado por el usuario y ejecutará los comandos fecha y usuarios, obteniendo las respuestas correspondientes del servidor. Debemos recordar en todo momento cómo funciona el protocolo que hemos definido (ver la primera entrega). En definitiva, no estamos haciendo más que implementar un nuevo cliente.

Por simplicidad, hemos utilizado un puerto fijo para todos los servidores (el 2222), aunque este podría variar, y la lista de servidores solo incluye al localhost (127.0.0.1).

Interacción con el servidor

Si comparamos el código PHP con el del cliente original desarrollado en Perl notaremos que hay grandes similitudes entre ambos.

Finalmente, la parte del script que produce la salida HTML con la lista de servidores que pueden ser monitoreados y los datos obtenidos desde el servidor actual.

Salida HTML

(Por comodidad y facilidad de visualización he puesto imágenes con el código PHP, pero si lo desea puede descargar el código fuente completo.)

A continuación, una muestra de cómo se vería la interfaz una vez consultado el servidor corriendo en 127.0.0.1:

Vista del sistema

Concluyendo

Hemos tomado un pequeño desvío para ver la implementación de un cliente en PHP, acercándonos a un ejemplo un poco más real del posible uso del servicio que hemos diseñado.

Más allá de los detalles propios de cada lenguaje, hemos podido apreciar las grandes similitudes a la hora de implementar un cliente.

En la próxima entrega retomaremos el tratamiento de los problemas relacionados con la ejecución de procesos concurrentes y threads. (¡Fin del recreo!)

Próxima entrega

  • Cuarta parte: El uso de recursos compartidos y los problemas
    de la concurrencia.

4 comentarios sobre “Programación para redes y concurrencia (III)

  1. Pingback: meneame.net
  2. Estimado: muy bueno la documentación, me gustaria que agregaran información sobre Lenguaje C, socket en C, y lo mejor que me encataria seria programacion segura en C.

    Saludos;

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *