Trabajo práctico
Objetivo
Escribir un servidor TCP que permite almacenar información ASCII en forma de clave-valor.
El servidor debe:
-
Esperar a que un cliente se conecte mediante el protocolo TCP, puerto 5000.
-
Esperar a que el cliente envíe un comando a ejecutar. El comando se especifica como una secuencia de caracteres ASCII hasta el
\n. -
Realizar la operación correspondiente.
-
Cortar la conexión con el cliente y volver al paso 1.
Los comandos que acepta el servidor son:
SET <clave> <valor>\n:- Se crea en el servidor un archivo llamado
<clave>con el contenido indicado en<valor>(sin incluir el\n). - Se responde al cliente
OK\n.
- Se crea en el servidor un archivo llamado
GET <clave>:- Si existe el archivo correspondiente, se responde al cliente con:
OK\n<valor>\n(es decir, una línea de texto que diceOKy otra que contiene el contenido del archivo). - Si no existe, se responde con
NOTFOUND\n
- Si existe el archivo correspondiente, se responde al cliente con:
DEL <clave>:- Si existe la el archivo correspondiente, se elimina.
- Tanto si existe como no, se responde
OK\n.
SIGUSR1
El servidor debe además escuchar la señal SIGUSR1, y al recibirla, si hay un cliente conectado, debe desconectarlo inmediatamente y pasar a esperar a que se conecte otro cliente. Si no hay ningún cliente conectado, el servidor debe ignorar la señal.
Mensajes en stdout
Al iniciar, el servidor debe imprimir su PID en stdout para que pueda ser utilizado posteriormente para enviarle señales.
Cuando se conecta un cliente, el servidor debe imprimir en stdout el mensaje cliente conectado: <IP del cliente>, y cuando se desconecta, debe imprimir cliente desconectado: <IP del cliente>.
Manejo de errores
Ante cualquier caso excepcional, se debe informar la causa imprimiendo un mensaje en stderr. Además, si se trata de un problema irrecuperable, el proceso debe finalizar con código de error. Al menos se deben manejar los siguientes casos:
- Alguna de las llamadas de sistema devuelve un error.
- El cliente se desconecta inesperadamente.
- El cliente envía un comando desconocido o con formato incorrecto (por ejemplo,
SETsin argumentos o con solo un argumento).
Cliente
Dado que el protocolo de comunicación es ASCII, no es necesario programar un cliente sino que se pueden utilizar herramientas como nc (netcat) o telnet.
En ubuntu se pueden instalar con: apt install netcat o apt install telnet.
Ejemplo
-
En la consola #1 (server):
./server -
En la consola #2 (client):
nc localhost 5000. Si la conexión es exitosa, el proceso se queda esperando a recibir entrada destdin.
$ nc localhost 5000
SET manzana apple
OK
$ nc localhost 5000
SET perro dog
OK
$ nc localhost 5000
SET hola hello
OK
$ nc localhost 5000
GET perro
OK
dog
$ nc localhost 5000
GET casa
NOTFOUND
$ nc localhost 5000
DEL perro
OK
$ nc localhost 5000
GET perro
NOTFOUND
$
Entrega
Entregar por mail, adjuntando el código fuente o (preferentemente) un link a un repositorio de Github.
- Fecha límite para la primera entrega: hasta clase 6
- Fecha límite de aprobación: hasta clase 8
Una vez recibida la corrección se permiten hasta 2 reentregas, siempre que sea antes de la fecha límite de aprobación.
Nota
La nota del TP se determina en base a la correctitud, prolijiidad y elegancia del código.
La nota final de la materia es un promedio entre la nota del TP y la nota del examen final.