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 poner en marcha 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 atiende un foro.
Sintaxis:    foro_setup  N Puerto local de escucha
Descripción: foro_setup crea un socket para atender la recepción de preguntas y el envío de preguntas al azar. Se trata de un servidor concurrente implementado usando hebras que acceden a un arreglo 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).  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 */
};

La lista circular de preguntas puede tener la siguiente estructura:

struct Circular_List {
   int numQuestions;   /* number of question already inserted  */
   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.
El formato de atención del servidor es:

U Nombre de autor pregunta /* para ingresar una pregunta donde se indica primero un byte con la letra U (de submission), luego el nombre del autor terminando con byte 0 y finalmente la pregunta terminando con byte 0.*/    El servidor responde enviando un caracter F si el arreglo está lleno (Full) u O si se trata de un ingreso exitoso (OK)

E /* con comando E el servidor retorna y elimina del arreglo una pregunta al azar. Se envía en el siguiente formato:
Nombre de autor pregunta /* nombre del autor terminando con byte 0 y finalmente la pregunta terminando con byte 0.*/

S  /* cuando se recibe este comando, el servidor pone término a su ejecución (el servicio es concluido) */

foro_qsu: Foro question submission  - programa cliente para ingresar una pregunta al foro.
Sintaxis: foro_qsu  máquina servidora del foro Puerto remoto del servidor
Descripción: foro_qsu solicita al usuario su nombre completo y luego la 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 terminar a ejecución del servidor.

Sintaxis: foro_qse máquina servidora del foro Puerto remoto del servidor [s]
Descripción: foro_qse pide la selección y  eliminación de una pregunta. Recibe 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, foro_qse envía el comando S para concluir el foro.

Ayuda

* En clases o en horario de atención a estudiantes, el profesor atenderá 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.