En esta práctica realizaremos un sistema transferencia de ficheros que formará parte de un sistema mayor en las próximas prácticas, usando el sistema de autentificación de la práctica anterior. La idea principal es establecer un protocolo que entenderá cualquiera de los programas de cualquiera de los grupos de modo que puedan comunicarse entre sí.
Está permitido comentar y debatir la práctica con otros grupos, incluso se recomienda probar el protocolo con otros grupos, pero bajo ningún concepto está permitido compartir o copiar código de otros grupos. Incumplir esta norma acarreará el suspenso de la práctica.
El protocolo a nivel de aplicación será de tipo cliente-servidor y se controlara desde la sesión autenticada de la práctica anterior. Un usuario correctamente logeado en el servidor puede pedir una operación de enviar un fichero al servidor o recibir un fichero desde el servidor.
| Cliente | dirección | Servidor |
|---|---|---|
| SUBEFICHERO [nombre] | -> | |
| <- | SUBEFAIL |
| Cliente | dirección | Servidor |
|---|---|---|
| SUBEFICHERO [nombre] | -> | |
| el servidor lanza el programa para recibir el fichero | ||
| <- | SUBEPUERTO [puerto] | |
| el cliente lanza el programa para recibir el fichero | ||
| SUBEFICHERO START | -> | |
| el servidor espera a que acabe el programa | ||
| <- | SUBESTATS [OK/FAIL] [t] [Mbps] |
| Cliente | dirección | Servidor |
|---|---|---|
| BAJAFICHERO [nombre] | -> | |
| <- | BAJAFAIL |
| Cliente | dirección | Servidor |
|---|---|---|
| BAJAFICHERO [nombre] | -> | |
| el servidor lanza el programa para recibir el fichero | ||
| <- | BAJAPUERTO [puerto] | |
| el cliente lanza el programa para recibir el fichero | ||
| el servidor espera a que acabe el programa | ||
| BAJAFICHERO FINISHED | -> | |
| <- | BAJASTATS [OK/FAIL] [t] [Mbps] |
En ambos casos el servidor contestara si acepta el envio o la recepcion indicando un puerto en el que lanzara un servidor para enviar o recibir el fichero. En el caso de que no acepte el envio o la recepcion enviará una indicación de fallo. Puede rechazar una subida porque ya haya un fichero ene l servidor que se llame asi. Puede rechazar una bajada porque no tenga un fichero con ese nombre.
nombre sera el nombre del fichero que se dara al fichero en el servidor. El nombre de fichero no puede contener /. El servidor solo enviara ficheros de un directorio files y solo guardara ficheros en ese directorio es un ERROR de seguridad MUY GRAVE que envíe ficheros de otro directorio o que deje escribir en otro sitio.
Tras
En la siguiente práctica añadiremos al protocolo operaciones para borrar ficheros y listar los ficheros que tiene.
El protocolo de transferencia se hara mediante programas que se lanzaran independientemente. El servidor lanzara un proceso para ejecutar el binario servidor_fichero y el cliente lanzara el binario cliente_fichero. El servidor_fichero abrira un socket escuchando en el puerto indicado y esperara una conexíón de cliente_fichero el protocolo en la conexión será
Realizar un cliente que cumpla el protocolo.
Esta es la especificación del cliente:
FORMATO
cliente_fichero <ipservidor> <puerto> envia <nombreficherolocal>
cliente_fichero <ipservidor> <puerto> recibe <nombreficherolocal>
DESCRIPCIÓN
<ipservidor> direccion IP del servidor para establecer la conexión
<puerto> puerto al que realizar la conexión
[envia|recibe] indica si debe enviar o recibir el fichero (es aceptable que compruebe solo la primera letra r recibir r enviar)
<nombreficherolocal> nombre local donde se guardara el fichero recibido del servidor o del fichero local que se enviara al servidor. Es un nombre en el sistema de ficheros local que no tiene por que ser el mismo nombre que usara el servidor
El cliente establecerá una conexión con el servidor y puerto indicado
Si le pedimos enviar ira leyendo el fichero y enviandolo al servidor cerrando la conexión para señalizar que ha terminado
Si le pedimos recibir ira leyendo lo que llega por la conexion y escribiendo en el fichero el cierre de la conexión indica que el fichero ha terminado.
El proceso debe devoler un estado de EXIT_SUCCESS si el fichero ha sido correctamente transferido. Ver función exit(). En caso contrario devolvera algun tipo de error
Realizar un servidor que cumpla el protocolo.
Esta es la especificación del servidor:
FORMATO
servidor_fichero <puerto> envia <nombrefichero> <timeout>
servidor_fichero <puerto> recibe <nombrefichero> <timeout>
DESCRIPCIÓN
<puerto> puerto en el que escuchar conexiones
<nombrefichero> nombre de fichero que enviar o con que se guardara el fichero recibido
<timeout> tiempo máximo que esperar la conexión si no se produce. Si pasa ese tiempo sin que nadie se conecte cerrar el puerto y el programa
el servidor abrirá un socket en el puerto indicado y esperará conexiones, si pasa el tiempo sin recibir una conexión se cerrará cancelando la transferencia
si recibe una conexión y se le ha pedido enviar el fichero enviará el contenido del fichero y cerrará la conexión para marcar el final al cliente
si no hay fichero que enviar no llegará a escuchar conexiones
si recibe una conexión y se le he pedido recibir el fichero recibira los datos que lleguen por la conexión y los guardara en el fichero
si ya existe el fichero no lo machacara y no llegara a escuchar conexiones
El proceso debe devoler un estado de EXIT_SUCCESS si el fichero ha sido correctamente transferido. Ver función exit(). En caso contrario devolvera algun tipo de error.
Igual que el de la practica 3 pero que tenga la función de enviar ficheros locales y recibir ficheros del servidor.
Igual que el de la practica 3 pero que tenga la función de enviar ficheros locales y recibir ficheros del servidor.
Solo recibe ficheros del directorio files
En el mismo directorio practicas que creamos en la práctica anterior, crear un directorio que se llame practica4. En practica4 existirán al menos estos ficheros:
makefilecliente.cservidor.ccliente_fichero.cservidor_fichero.cEl fichero makefile tendrá cuatro objetivos: todos, cliente, servidor, servidor_fichero, cliente_ficherp y clean.
Los ficheros que se entregan se recogerán directamente de Bitbucket. No se admite otro método de entrega.
No entregar los archivos de construcción intermedios ni los ejecutables.