Comandos
vcCS
Servidor del Video Club
vcUser:
Cliente del Video Club
vcAdmin Administrador
del video Club
vcVRS
Servidor de recepción de video
Sintaxis
vcCS <puerto usuario> <puerto conexion
con servidor de recepción> <puerto multicast><grupo multicast>
vcUser <nombre de máquina del servidor><puerto
de usuario>
vcAdmin <nombre de máquina del servidor><puerto
de usuario>
vcVRS <puerto de conexión
con el transmisor de videos>
Archivos Relacionados: videos.txt, listavideos.h
Este sistema permite realizar programaciones a pedido, y enviar videos
a destino. El servidor maneja una lista de videos con sus duraciones contenida
en el archivo videos.txt. El formato de este archivo es
<nªvideo> ^<nombre>^<minutos>^<ruta de acceso>
El cliente tiene 4 opciones:
- Listar los videos disponibles(videos.txt) : Se lista:
Número del video
Nombre del Video Duración
- Ver los videos ya programados. Se lista:
Número de video
Nombre del Video Hora de salida
al aire
Además se indica cual está siendo transmitido
actualmente. En este caso la salida indica en el aire
hace XXX minutos en la columna Hora de salida al
aire.
- Programar un video: en este caso, el cliente debe ingresar además
el
número de video que desea ver, la hora máxima en que
puede ser programado, correo electrónico del usuario y máquina
de destino del video
- Salir
Por otra parte, en la máquina de destino debe estar corriendo
el programa vcVRS, que se encarga de almacenar el video enviado por el
servidor
Finalmente, a través del programa vcAdmin se puede ingresar
remotamente al servidor para cambiar la lista de videos disponibles, agregando
o quitando videos de videos.txt.
programa vcCS
El servidor cumple con las siguientes funciones:
-
Crea un socket para atender conexiones de usuario y administracion
-
Espera conexiones remotas y atiende sus requerimientos, distinguiendo entre
conexiones de administración y de programación
-
Lee el archivo video.txt y lo descompone en los nombres de los videos y
las duraciones de cada video en segundos. Estos datos son guardados en
arreglos
-
Modifica el archivo video.txt en base a los cambios recibidos desde el
administrador
-
Lee las opciones ingresadas en el cliente, y le devuelve los datos necesarios.
-
Modifica la programación en base a los datos ingresados por
el cliente
-
Mantiene actualizada la programación, chequeando periodicamente
si hay videos finalizados
-
Establece conexiones con los servidores de video para monitorear el envío
de videos
-
Envía los videos a través de un canal multicast
-
Envía un mail notificando el envío
Para realizar esto el servidor cuenta con varias funciones
:
-
función main: crea el socket de usuarios
y espera conexiones. Se utiliza un ciclo infinito que contiene la función
select con un tiempo de espera de 60 segundos. Si no hay conexiones en
ese tiempo, el programa chequea si es necesario enviar un video. No se
producen retardos en el envío mayores a 1 minuto. Si hay actividad
en los sockets se tienen 2 opciones: si es una conexion nueva, se acepta
la conexión y se crea un nuevo socket para atenderla. si es una
conexión existente, se atiende su requerimiento mediante la función
conexion.
-
función conexion :se encarga de distinguir si se trata
de una conexión de usuario normal o de administración. Para
esto, lee un caracter. Si se trata de una conexión de usuario, este
caracter será un 0. Si no, será un 1. En base a esto, la
función conexion llama a la función encargada de atender
cada tipo de conexión.
-
función Echoserve: Atiende las conexiones de
administración. Lee primero la opción ingresada por el administrador.
Luego envía la información de videos disponibles. Esta información
se carga desde el archivo video.txt hacia la estructura videos.
Esta estructura se define en el archivo listavideo.h, y contiene
campos para los nombres, números, duraciones y rutas de acceso.
Si se ingresa la opción uno, la función retorna luego de
enviar.ya que el Admin. sólo está solicitando la lista de
videos. Si la opción es otra, entonces significa que el administrador
hará modificaciones, por lo que se espera que se retorne una estructura
videos modificada, la cual es transcrita al archivo videos.txt
-
función Echoserve2: se encarga de atender a los usuarios.
Primero recibe la opción ingresada por el usuario. Si esta es 1,
envía la estructura videos y retorna. Si es 2, entra a la función
m_prog, la cual envía los videos programados al cliente. Si la opción
es 3, se entra a la función programa que se encarga de gestionar
las peticiones de programación.
-
función programa: se encarga de ingresar las
peticiones de los clientes a la programación. La programación
es almacenada en la estructura prog, definida también
en listavideo.h . prog contiene
el arreglo 2-D progra, el cual tiene 4 columnas. Cada columna representa:
1.- número del video pedido
2.- hora de inicio de la Tx
3.- Hora término de la Tx
4.- Hora máxima en la que se puede transmitir
Las horas se almacenan en segundos a partir de las 0:00 del 1/1/1970.
Además, programa
modifica también arreglos de estructuras de tipo lista_
nombres definido también en listavideo.h. Esta estructura tiene
dos campos: el arreglo de strings name y el entero num.
usuarios
y máquinas
de prog son arreglos de estructuras de estos tipos.
Por cada video programado, se asigna un elemento de usuarios
y
maquinas. Esto permite que por cada video a transmitir se pueda
tener una conjunto de usuarios y máquinas de destino, lo cual es
necesario si se quiere realizar una transmisión multicast.
num
indica la cantidad de usuarios de destino que existen por cada video. Por
defecto, programa ordena las peticiones en forma FCFS, programando cada
petición lo más pronto posible La función programa
trabaja entonces de la siguiente forma:
- Si no hay videos programados programa la petición 60 segundos
más tarde, a partir del horario actual.
- Si existen videos programados, se revisa si existe alguno de los
ya programados que coincida con el que se quiere programar, y que su hora
de programación no exceda la hora máxima permitida
para el video en programación. De esta forma, varios usuarios reciben
un mismo video por un sólo canal multicast.
- Si el video deseado no está programado, se revisa si es posible
programar el nuevo video al final de la lista de los otros
- Si ninguna de las acciones anteriores es posible, entonces no es
posible programar el video.
Al cliente se le envía la hora en que se programó su
video o 0 en caso de que no se haya podido programar. El recptor interpreta
el 0 como que no se pudo programar el video.
-
función m_prog: se encarga de mostrar al cliente los
videos ya programados.Utiliza el arreglo progra de la estructura
prog,
que contiene la programación, y básicamente transforma a
texto la información contenida en el arreglo . Este texto
es enviado a través del socket al cliente
-
función actualiza: se encarga de actualizar la estructura
prog,
chequeando si hay películas ya terminadas. si las hay, las elimina
de la programación, y actualiza el arreglo
-
función enviavideo:Esta funcion envía
el video a las máquinas de destino. Primero chequea si es necesario
transmitir. Para esto, revisa primero si hay videos programados. Si los
hay, revisa si el video que se deberia estar transmitiendo (el primero
en la lista de programación) es el que el programa tiene almacenado
como el último video en transmisión (cuyos datos están
almacenado en el arreglo videotx) . Si es el mismo, entonces no se hace
nada. Si es distinto, significa que la transmisión del video anterior
finalizó, y que hay que transmitir el que ahora debería
estar en transmisión. Entonces, se actualiza el arreglo videotx,
y luego se realiza un fork. El programa padre vuelve al main a atender
las conexiones. El hijo crea un socket un socket TCP por cada maquina
de destino. A cada máquina , le envía el título del
video, el canal multicast que se utilizará y el puerto que
debe utilizar para recibir el video. Una vez que recibe confirmación
de todos los destinos en tra a la función multicast,
entregandole como argumentos el puerto y el video que se debe utilizar
para la transmisión multicast. Una vez que retorna
esta función, se envía un aviso
a cada destino que la transmisión ha finalizado, se cierra el socket
TCP y finalmente se entra a la función enviamail, la cual
envia un mail a cada usuario avisando la transmisión exitosa del
video.
-
función multicast: Se crea primero el socket para
enviar los paquetes multicast, y se activan las opciones asociadas
a este (loopback y ttl). Además se crea la estructura sockaddr_in
asociada al grupo multicast al cual se enviará el archivo. Luego,
se abre el archivo en base a la ruta de acceso, y se envía,
en segmentos de 1kbyte. Entre cada segmento se espera 0.5 [ms] para enviar
el siguiente paquete. De esta forma se previene la pérdida de paquetes
en el receptor, lo cual puede ocurrir si la máquina receptora es
más lenta. Una vez enviado el archivo, se espera un poco mediante
la función sleep antes de retornar. de esta forma, se garantiza
que la señal de termino de envío llegue al receptor después
de que hayan llegado los paquetes multicast.
-
función enviamail: Envía un mail de notificación
a cada usuario que haya recibido un video. Adaptada de una función
vista en clases.
programa vcUser
El programa del usuario básicamente recoge las opciones del usuario,
las envía al servidor, y despliega en pantalla los datos enviados
por este
En base a los argumentos ingresados al ejecutar el programa, este construye
el socket usado para comunicarse con el servidor, y luego trata de conectarse
a este.
El programa comienza desplegando un menú, y pidiendo una opción
al usuario.
Cuando el usuario ingresa una opción, se envía primero
un caracter "0" indicando al servidor que se trata de una conexion de usuario.
Luego la opción ingresada es enviada al servidor.
Para las dos primeras opciones , el cliente luego espera los datos
enviados por el servidor y los despliega en pantalla. En el primer caso,
recibe una estructura del tipo videos con los videos disponibles.
A partir de esta estructura el programa sintetiza la información
que despliega en pantalla. En el segundo caso, se muestra la programación
directamente desde el buffer recibido.
Para la opción 3, el cliente pide al usuario que ingrese el
numero de video, la fecha máxima en que se puede programar la petición
(en formato Nºvideo/mes/dia/hora/minutos/correoelectrónico).
Por ejemplo para ingresar el video 1 para el 5 de octubre a las 10:00 am
se debe ingresar:
1/10/5/10/00/zero@elo.utfsm.cl
Luego, se solicita la máquina a la que se debe enviar el video
programado
programa vcAdmin
Este programa permite que un administrador se conecte en forma remota y
efectue cambios en los videos disponibles.
En base a los argumentos ingresados al ejecutar el programa, este construye
el socket usado para comunicarse con el servidor, y luego trata de conectarse
a
este.
El administador tiene tres opciones. Al ingresar la opción,
se envía primero el caracter "1", el cual indica a vcCS que se trata
de una conexión de administración. Luego se envía
la opción al servidor y este retorna una estructura del tipo videos
que
contiene la información actual del archivo video.txt.
Si se ingresa la opción 1, se despliegan los datos en pantalla
como en el programa anterior. Si se ingresa la opción 2, se
pregunta los datos del nuevo video a ingresar y se modifica la estructura
videos.
Si se ingresa la opción 3, se pregunta que video se desea eliminar
y se modifica la estructura videos. en estos dos casos, se envía
de vuelta la estructura videos al servidor, lo que permite a este modificar
el archivo videos.txt.
programa vcVRS
Este programa recibe el video desde el servidor. Crea primero un
socket y espera conexion desde el servidor. Al producirse la conexión,
recibe los datos del canal multicast al que debe conectarse para recibir
el video, así como el nombre del video. Se une al canal multicast
, se abre el archivo y se espera por la llegada de paqutes desde el canal
multicast. o por una señal de termino desde la conexión TCP.
Para esto, ambos sockets (TCP y Multicast) son monitoreados por la
función select. La llegada de cualquier dato por la conexión
TCP indica el fin de la transmisión. En este caso, se cierran los
sockets y se termina la ejecución del programa.
Nota: Los videos son almacenados en el directorio temporal de la máquina
de destino. Esto se debe a que si el archivo se guarda en el directorio
donde se ejecuta el programa, y si ese directorio corresponde a una cuenta
montada desde una máquina externa, entonces la escritura del archivo
interfiere con la recepción, lo que provoca la pérdida de
paquetes.
A continuación se muestra un diagrama de los programas y su interacción