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.
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.
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.