This repository was archived by the owner on Nov 4, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
chat : client : handler_functions.c
sᴀʟᴠᴀᴛᴏʀᴇ ʙ edited this page Jul 23, 2017
·
1 revision
Questo modulo si divide in 3 funzioni specifiche, necessarie rispettivamente :
- alla ricezione di un messaggio da parte di un client;
- avvertire il client che il destinatario di un messaggio inviato non esiste;
- gestire la terminazione di un client se riceve un segnale SIGINT (^C). NOTA: alla fine di ogni funzione viene reimpostata l’associazione all’handler attraverso la funzione signal(), dato che altrimenti verrebbe riportata all’handler di default.
void handler_new_message() {
//lettura e inserimento nel buffer messages (dichiarato in main_client.h)
countMessages++;
totalMessages++;
//rialloco totalMessages puntatori
messages = realloc(messages, sizeof(char*) * totalMessages);
if (messages == NULL)
exit(EXIT_FAILURE);
//alloco lo spazio per il nuovo messaggio
messages[totalMessages - 1] = malloc(sizeof(char) * MAX_LENGTH_MSG);
if (messages[totalMessages - 1] == NULL)
exit(EXIT_FAILURE);
char* ptr = messages[totalMessages - 1]; //alias
int n;
do { // Legge fino a '\0' o EOF
n = read(fdClientPipe, ptr, 1);
} while (n > 0 && *ptr++ != '\0');
printf("\n[NOTA] E' disponibile un nuovo messaggio (aggiorna il menu' per vedere quanti ne sono disponibili).\n");
fflush(stdout);
signal(SIGUSR1, handler_new_message); //riattivo l'handler
}I messaggi ricevuti possono essere visualizzati dall’apposita sezione del menù principale. La variabile che contiene i messaggi è realizzata attraverso una matrice allocata dinamicamente:
- ogni volta che si riceve un segnale
SIGUSR1, esso indica che c’è un nuovo messaggio e si aumentano le variabilitotal/countMessages; - in seguito si rialloca lo spazio necessario per contenere un numero di puntatori a stringhe pari a
totalMessages; - infine si alloca lo spazio (che sarà
MAX_LENGTH_MSG) e si legge il messaggio dalla pipe; - si stampa un messaggio per notificare l’utente che è disponibile un nuovo messaggio.
void handler_dest_not_found() {
printf("\n[NOTA] Il messaggio non e' stato recapitato: uno o piu' destinatari inesistenti.\n");
fflush(stdout);
signal(SIGUSR2, handler_dest_not_found); //riattivo l'handler
}void handler_termination() {
// prima di uscire e' necessario avvisare della propria disconnessione
disconnect();
exit(EXIT_SUCCESS);
}In caso di SIGINT, l’handler provvede a richiamare la disconnessione attraverso la funzione disconnect(), in modo da eliminare il client dalla lista del server.
Made with ❤️ by Owanesh and MatteoMauro | MIT ©