====== Esercitazione 10 ====== Socket AF_UNIX, comunicazione client-server. Server multithreaded e gestione di più connessioni utilizzando la SC ''select''. Per gli esercizi proposti si richiede di realizzare un Makefile. ===== Esercizio 1 ===== Realizzare in C un programma client ed un programma server. I due processi intergiscono utilizzando socket AF_UNIX. Il client apre una connessione verso il server ed invia richieste (sotto forma di stringhe) corrispondenti ad operazioni aritmetiche inserite dall'utente (es. 2+1, 3/4 + 2/7, sqrt(5) + 3.14, ...). Il server gestisce una connessione alla volta. Il client invia una stringa di comandi alla volta ed attende il risultato. Per eseguire l'operazione, il server lancia un processo che esegue la calcolatrice testuale 'bc'. Il messaggio di risposta del server è una stringa contenente il risultato calcolato. La sequenza di operazioni termina quando il client riceve in input la stringa "quit" dall'utente. Il server si rimette in attesa di ricevere una nuova connessione da un client. ===== Esercizio 2 ===== Realizzare un programma C che implementa server che rimane sempre attivo in attesa di richieste da parte di uno o piu' processi client. Ogni client richiede al server la trasformazione di tutti i caratteri minuscoli di una stringa in caratteri maiuscoli (es. ciao –> CIAO). Per ogni nuova connessione il server lancia un thread POSIX che gestisce tutte le richieste del client e quindi termina la sua esecuzione quando il client chiude la connessione.\\ Per testare il programma implementare uno script bash che lancia un certo numero di client ognuno che invia una o piu' richieste al server multithreaded.\\ Possibile estensione: invece di attivare ogni volta un nuovo thread, gestire un pool di N threads ed effettuare lo scheduling delle richieste dei client sul pool di thread. ===== Esercizio 3 ===== Realizzare un server analogo a quello dell'Esercizio 2, senza pero' usare i therad, ma utilizzando la chiamata di sistema ''select'' per risolvere il non determinismo fra l'accettazione di nuove connessioni da parte dei client e la lettura dei messaggi dai client gia' connessi.