Next: About this document ...
Up: Pipe con nome (FIFO)
Previous: Persistenza
Scriviamo la nostra prima applicazione client-server. In questo
esercizio, il server accetta 2 tipi di richieste:
- richieste di criptare una stringa;
- richieste di descriptare una stringa.
La stringa viene criptata semplicemente aggiungendo un offset fisso a
ogni carattere della stringa, e viene decriptata togliendo
l'offset. Naturalmente è possibile implementare algoritmi più
complessi!!
Il server fa dunque i seguenti passi:
- crea la FIFO;
- si mette in attesa sulla FIFO per ricevere il messaggio del
client, che contiene:
- il tipo di richiesta;
- la FIFO di risposta (su cui scrivere i dati);
- la stringa da criptare;
- non appena riceve una richiesta,
- apre la FIFO specificata in scrittura,
- serve la richiesta
- spedisce la risposta sulla FIFO specificata,
- chiude la FIFO;
- si rimette in attesa di un'altra richiesta.
Scrivere il programma client in modo che:
- crei una FIFO unica nel sistema (contente nel nome il proprio
pid);
- accetti in input una stringa e il tipo di richiesta (criptare o
decriptare);
- mandi la richiesta di al server;
- apra la propria FIFO in lettura;
- prenda la risposta dalla proprio FIFO;
- chiuda la FIFO;
- stampi a video il risultato;
Ovviamente, la FIFO su cui il server accetta le richieste deve avere
un nome pubblico ben conosciuto da tutti i client!! Inoltre bisogna
definire una specie di ``protocollo'' di comunicazione fra il server e
il client, cioè bisogna specificare il formato dei dati da
scambiare. Per semplicità supporremo che il carattere ``ritorno
carrello'' non possa far parte della stringa da tradurre.
Suggerimenti:
- Fare un header file che contenga tutte le definizioni a comune
tra client e server;
- prestare una cura particolare nel controllare i buffer
overflow... cosa succede se la stringa passata è molto lunga??
- Un requirement importante è che il server non si deve
incasinare mai. Specialmente se il client si comporta ``male''. È
possibile farlo? E se si come ?
- Prevedere tutti i casi possibili! Enumerarli su un foglio e
cercare di definire il comportamento del server in ogni caso.
- Attenzione alla chiusura delle FIFO... se il server ha la sua
FIFO aperta in lettura, non appena il client la chiude, la read nel
server ritorna con errore! Trovare un modo per ovviare a questo
inconveniente.
Possibile soluzione:
:
Header file : criptserv.h
Server: criptserv.c
Client: client.c
Next: About this document ...
Up: Pipe con nome (FIFO)
Previous: Persistenza
2000-11-20