ELO-330: Programación de Sistemas

Tarea 3: Formulación y Selección de Preguntas en Foro Distribuido

Objetivos: En esta tarea usted aplicará: creación de hebras, acceso sincronizado a recursos compartidos, comunicación entre procesos remotos siguiendo el modelo cliente-servidor, desarrollo de un servidor concurrente, y diseño y manejo de un protocolo de capa aplicación. Ejercitar el uso de GIT,  Preparar documentación de un sistema de software.

Contexto

    En las comunidades con democracia representativa es común organizar elecciones donde la comunidad elige a quienes la representarán en consejos, centros, o como líderes. En estos procesos de elección es necesario informar a la comunidad los proyectos o visiones de cada miembro que aspira a ocupar un cargo de representación. Para tal propósito se suelen organizar foros o debates donde la comunidad tiene la opción de formular preguntas a los candidatos. Para organizar tal proceso, suele haber un moderador que recibe las preguntas y, generalmente al azar, las selecciona para ser respondidas por los candidatos.

    Inspirada en la situación previa, en esta tarea se desarrollarán tres programas (Figura 1): uno para ingresar una pregunta (foro_qsu), otro para seleccionar una pregunta al azar y poner término al foro (foro_qse), un tercero para gestionar el repositorio de preguntas (foro_setup). Los tres programas corren posiblemente en máquinas separadas conectadas a través de Internet. Se busca principalmente diseñar un sistema básico y aplicar conceptos de programación listados en los objetivo. No se busca un sistema a toda prueba; por ejemplo, aspectos de seguridad para restringir el acceso a ciertos usuarios no son considerados.

Figura 1: Arquitectura general del Sistema de apoyo a Foros Distribuidos


Programas a Desarrollar

Desarrolle los siguientes programas: foro_setup, foro_qsu, foro_qse.

foro_setup : Foro setup - programa servidor que mantiene el repositorio de preguntas del foro.
Sintaxis:    foro_setup  <N> <Puerto local de escucha>
Descripción: foro_setup crea un socket para atender la recepción de preguntas y la selección de preguntas al azar. Se trata de un servidor concurrente implementado usando hebras que acceden a un arreglo común con capacidad para N entradas (o registros de preguntas). Usted puede imaginar que se crea un buzón para almacenar y luego retirar preguntas al azar. Este servidor usa la biblioteca POSIX. El registro de preguntas se almacena en un arreglo en la memoria el servidor (no del sistema operativo). No es la idea usar memoria compartida.  Cada entrada del arreglo puede tener la siguiente estructura:

struct Question {
   char name[MAX_NAME_LENGTH]; /* null character terminated string */
   char text[MAX_QUESTION_LENGTH];  /* null character terminated string */
};

El buzón de preguntas puede tener la siguiente estructura:

struct QuestionBox {
   int numQuestions;   /* number of question already inserted  */
   int size;                    /* maximun number of question  (=N) */ 
   struct Question questions[N];  /* questions are stored from index 0 to numQuestions-1 */ 
}

El parámetro N indica el número máximo de preguntas del arreglo. El Puerto local de escucha  es el puerto donde los clientes deben acceder a los servicios del servidor foro_setup.
El formato de los requerimientos de atención recibidos por el servidor es:

foro_qsu: Foro question submission  - programa cliente para ingresar una pregunta al foro.

Sintaxis: foro_qsu  <máquina servidora del foro> <Puerto de atención en servidor>
Descripción: foro_qsu solicita al usuario su nombre completo y luego una pregunta. Luego de su ingreso, foro_qsu contacta al servidor y envía en comando "U" (submission) para ingresar la pregunta en el servidor. Los parámetros ingresados corresponden a la máquina y el puerto donde corre el servidor. foro_qsu indica al usuario si pudo o no hacer un ingreso exitoso.

foro_qse: Foro question selection - programa para seleccionar una pregunta del foro o termina la ejecución del servidor.

Sintaxis: foro_qse <máquina servidora del foro> <Puerto de atención en servidor> [s]
Descripción: foro_qse pide la selección aleatoria, eliminación y envío de una pregunta. Este programa envía el comando "E" y recibe como respuesta desde el servidor el nombre del autor y la pregunta seleccionada,  y envía a su salida estándar el nombre del autor y la pregunta en cuestión. Los parámetros máquina servidora del foro Puerto remoto del servidor corresponden a la máquina y puerto donde corre el servidor. Cuando además se ingresa la opción 's' al final, en lugar de solicitar una pregunta, foro_qse envía el comando S para concluir el foro.

Ayuda

* Por correo el ayudante y profesor atenderán con gusto cualquier consulta.
* Más ayuda puede ser incluida en la medida que surjan vuestras preguntas.
* Haga su tarea de a poco y con tiempo.