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

chat : client : main_client.c\h

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

main_client.h

#define MAX_LENGTH_MSG 4096

extern int fdClientPipe;
extern int fdServerPipe;
extern char** messages;
extern int countMessages;
extern int totalMessages;

Descrizione delle variabili:

  • fdClientPipe: file descriptor della pipe aperta in lettura (il nome del file su disco è “<pid_client>_client_pipe”);
  • fdServerPipe: file descriptor della pipe aperta in scrittura (il nome del file su disco è “server_pipe”);
  • messages: matrice di stringhe, ogni riga rappresenta un messaggio ricevuto;
  • countMessages: numero di nuovi messaggi ricevuti e non ancora letti;
  • totalMessages: numero totale di messaggi ricevuti durante la sessione corrente.

main_client.c

int connected = 0;
//definizione delle variabile extern dichiarate in main_client.h
int fdClientPipe;
int fdServerPipe;
char** messages = NULL;
int countMessages = 0;
int totalMessages = 0;


/* Controlla la scelta dell'utente ed invoca le funzioni opportune */
void switchOptions(int value) {
	switch (value) {
	case 1:
		if (connected) {
			printf("Sei connesso.\n");
		} else {
			if (connect()) {
				connected = 1;
			} else {
				printf("Connessione non riuscita.\n");
			}
		}
		break;
	case 2:
		if (connected)
			getListOfClients();
		else
			printf("Non sei connesso.\n");
		break;
	case 3:
		if (connected)
			sendMessage();
		else
			printf("Non sei connesso.\n");
		break;
	case 4:
		if (connected)
			seeNewMessages();
		else
			printf("Non sei connesso.\n");
		break;
	case 5:
		if (connected) {
			disconnect();
			connected = 0;
		} else
			printf("Non sei connesso.\n");
		break;
	case 6:
		break;
	case 7:
		if (connected)
			disconnect();
		break;
	}
}
int main(int argc, const char **argv) {
	//^C richiama l'handler di disconnessione prima di terminare il programma
	signal(SIGINT, handler_termination);
	//routine di gestione di un nuovo messaggio riceuto
	signal(SIGUSR1, handler_new_message);
	//ruotine di gestione "destinatario non trovato"
	signal(SIGUSR2, handler_dest_not_found);
	int optionsAllowed[] = { 1, 7 };
	int value;
	do {
		char footer[30];
		sprintf(footer, "Hai %d nuovi messaggi", countMessages);
		printMenu(options, "Chat C", footer, false, true, 50);
		value = selectOption("Selezionare un'opzione del menu': ",
				optionsAllowed,
				NULL, 0);
		switchOptions(value);
	} while (value != 7);
	printf("\nProgramma terminato.");
	exit(EXIT_SUCCESS);
}

Analogamente a vecchi esercizi, si utilizza una funzione switchCommand per determinare l’azione da intraprendere sulla base della scelta dell’utente. La funzione main inizialmente imposta gli handler opportuni ai segnali SIGUSR1 e SIGUSR2, che verranno usati rispettivamente per avvertire l’utente che è disponibile un nuovo messaggio e per avvertire che l’ultimo messaggio inviato non è stato ricevuto da uno o più destinatari; inoltre SIGINT viene ridefinito per eseguire una disconnessione dal server prima di terminare l’esecuzione del programma (gli handler sono approfonditi nel relativo paragrafo).

Le variabili globalmente definite in main_client.c (tranne int connected) sono dichiarate esternamente in main_client.h, essendo variabili utilizzate trasversalmente in tutto il programma è stato più opportuno realizzarle in tal modo (i loro scopi verranno spiegati nel corso della relazione). Un utente che esegue un client dovrebbe prima di tutto connettersi al server digitando l’opzione 1, fino ad allora ogni altra operazione viene disabilitata con un messaggio di avvertimento.

Il footer del menù principale contiene di volta in volta il numero di messaggi ricevuti e non letti: tale conteggio è aumentato dall’handler associato, ma dato che sarebbe stato inopportuno far ristampare il menù dall’handler stesso (poiché l’utente potrebbe trovarsi in altre parti del programma come per esempio la scrittura di un nuovo messaggio) è stata aggiunta l’opzione “(6) Aggiorna il menù”.

Clone this wiki locally