Chat multiutente con le FIFO
Ogni messaggio è ha il seguente formato:
struct messaggio{
char tipo;
char mittente[30];
char ricevente[30];
char msg[256];
};
Server
Il server crea una FIFO di nome “canale” sulla quale tutti i client possono scrivere dei messaggi.
Mantiene una lista degli utenti registrati e con un flag lo stato di ciascuno (connesso, non connesso), inizialmente tutti gli utenti sono impostati allo stato non connesso.
I messaggi di tipo {'I',”nick”,””,””} rappresentano la sincronizzazione iniziale da parte di un client attivato dall'utente “nick”.
I messaggi di tipo {'F',”nick”,””,””} rappresentano la sincronizzazione finale da parte di un client attivato dall'utente “nick”.
I messaggi di tipo {'M',”nick mittente”,”nick destinatario”,””} rappresentano dei messaggi che un utente vuole inviare ad un altro.
Quando il server riceve un messaggio di tipo I esegue le seguenti operazioni:
• controlla se l'utente nick è presente nella lista, in caso negativo ignora le richieste successive
• in caso affermativo:
• mette il flag di stato del nick a connesso e crea una FIFO, se non esiste già, il cui nome corrisponde al nick specificato nel messaggio, questa FIFO rappresenta il mezzo da cui il client potrà leggere i messaggi inviati dagli altri utenti.
• se esiste un file il cui nome corrisponde al nick legge il suo contenuto (struct messaggio) e lo scrive sulla FIFO e poi elimina questo file.
Quando il server riceve un messaggio di tipo M esegue le seguenti operazioni:
• controlla se esiste una FIFO il cui nome corrisponde al ricevente, in quel caso scrive l'intero messaggio su questa FIFO, altrimenti aggiunge l'intero messaggio in un file avente come nome nome quello del ricevente.
Quando il server riceve un messaggio di tipo F esegue le seguenti operazioni:
• mette il flag di stato del nick a non connesso e cancella la FIFO il cui nome corrisponde al nick specificato nel messaggio
Client
Ogni client viene eseguito specificando sulla linea comando il proprio nickname.
Il programma crea un processo figlio.
Il padre scrive sulla FIFO “canale”, il figlio legge dalla FIFO che corrisponde al proprio nickname.
Il padre esegue le seguenti operazioni:
• scrive sulla FIFO “canale” il proprio messaggio di tipo I
• ciclicamente legge da tastiera una frase, compone una struct messaggio di tipo M e la scrive sulla FIFO “canale” fino quando la frase letta da tastiera corrispone a “fine”
• scrive sulla FIFO “canale” il proprio messaggio di tipo F
• fa terminare il proprio figlio Il figlio esegue le seguenti operazioni:
• legge ciclicamente dalla FIFO che corrisponde al proprio nickname e visualizza mittente e messaggio.