Skip to content
This repository was archived by the owner on Nov 4, 2023. It is now read-only.

chat : client : handler_functions.c

sᴀʟᴠᴀᴛᴏʀᴇ ʙ edited this page Jul 23, 2017 · 1 revision

Questo modulo si divide in 3 funzioni specifiche, necessarie rispettivamente :

  1. alla ricezione di un messaggio da parte di un client;
  2. avvertire il client che il destinatario di un messaggio inviato non esiste;
  3. 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:

  1. ogni volta che si riceve un segnale SIGUSR1, esso indica che c’è un nuovo messaggio e si aumentano le variabili total/countMessages;
  2. in seguito si rialloca lo spazio necessario per contenere un numero di puntatori a stringhe pari a totalMessages;
  3. infine si alloca lo spazio (che sarà MAX_LENGTH_MSG) e si legge il messaggio dalla pipe;
  4. 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.

Clone this wiki locally