ELO-330: Programación de Sistemas
Tarea 3: Sistema Chat

Nombre: chatServer: Chat Server, Servidor chat basado en hilos
               chatMonitor: Cliente en misma máquina que Chat Server, obtiene del servidor y despliega el número de conexiones y bytes transferidos por cada conexión.
               chatClient: Chat Client, cliente chat basado en hilos o no

Sintaxis: charServer [puerto_chat] [puerto_monitor]
puerto chat: puerto de escucha de de clientes chats. Es opcional; ante su ausencia, puerto asignado por SO es mostrado por pantalla.
puerto monitor: puerto de escucha de cliente monitor. Es opcional; ante su ausencia, puerto asignado por SO es mostrado por pantalla.
Si sólo uno se ingresa, corresponde a puerto chat.
               charMonitor  <puerto_monitor>
               charClient [máquina_servidora] [puerto chat]
máquina servidora: Máquina donde corre charServer
puerto char: puerto asociado al servicio chat

Descripción
    Chat Server es el servidor chat que corre centralizadamente para reenviar cada línea recibida hacia todos sus clientes, incluido aquel que lo envía. Una vez ejecutado, reportará por consola el número de puerto donde recibirá los requerimientos chat y el puerto para monitorear algunas actividades del servidor. chatServer hace uso de protocolo TCP. Para terminar el cliente monitor debe enviar el comenado "STOP". Chat Server es basado en hilos para recibir los datos de cada socket. Se debe asegurar que cada cliente reciba los mensajes en la misma secuencia. Chat Server además recibe conexiones en puerto_monitor sólo si el cliente se encuentra en la misma máquina donde corre Chat Server. Éste sólo responde a dos comandos desde el monitor "STOP" y "STATE", ante el cual Chat Server responde enviando el número de conexiones Chat Client siendo atendidas y la cantidad de bytes difundidos por cada clliente.
    Chat Client permite a usuarios intercambiar mensajes con sus pares gracias al servicio de Chat Server. Al ejecutar Chat Client, en su consala de ejecución es posible enviar líneas a hacia todos los usuarios corriendo Chat Client a través de un Chat Server. Cada línea enviada es precedida por el "user name" del dueño de la cuenta.  Chat Client además lanza una consola adicional para desplegar los mensajes recibidos. El texto recibido es desplegado línea a línea en la medida que éstas llegan. Client Chat envía una línea por vez,  recibe y desplega las líneas de todos los otros usuarios conectados al servidor. Un Chat Client concluye cuando el usuario envía en mensage "bye".
     Chat Monitor permite enviar dos comandos a través del teclado, éstos son "STOP" y "STATE".

Observaciones
  Chat Server debe estar implementado con hilos. Se sugiere usar un hilo por conexión para leer mensajes entrantes al servidor, usar un único hilo paa escribir en todos los sockets los mensajes salientes. Además se sugiere usar un buffer circular para manejar una cola de caracteres donde cada hilo receptor escribe en forma exclusiba cada línea recibida, para luego ser leídas por el otro hilo que lee desde este buffer y los envía a cada cliente. Usted puede optar por otras arquitecturas.

* Ver llamado getpwuid (o getlogin, no tan bueno).
* Ver comando
$ gnome-termnial -x cat
y piense cómo puede ser usado para desplegar los mensajes entrantes hacia el Chat Client.