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