RC [entrega] [Practica 1] [Practica 2] [Practica 3] [Practica 4] [Practica 5] [info ssh] [info git]

Práctica 4 - Transferencia de ficheros

Objetivos

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

Metodología

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.

Protocolo de control

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

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á

Objetivo 1: cliente

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

Objetivo 2: servidor

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.

Cliente y servidor con autenticacion y transferencia

Objetivo 3: cliente

Igual que el de la practica 3 pero que tenga la función de enviar ficheros locales y recibir ficheros del servidor.

Objetivo 4: 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

Cómo entregar el programa

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:

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