Scrivere una applicazione client/server in cui: Il client richiede come parametri sulla riga di comando, l'indirizzo IP del server e la porta su cui contattarlo, quindi una volta stabilita la connessione, esegue un ciclo infinito in cui legge stringhe dallo standard input e le invia al server; Il server è CONCORRENTE ed accetta come unico parametro il numero di porta su cui accettare connessioni e visualizza le stringe inviate dai client che si connettono su quella porta; Il client termina l'esecuzione quando l'utente inserisce la stringa exit, mentre client e server terminano entrambi l'esecuzione quando l'utente inserisce la stringa close. Modificare il client in modo che accetti nomi simbolici. Modificare il server in modo che stampi l'indirizzo IP e la porta del client da cui provengono le stringhe. Scrivere una applicazione client/server che implementi una shell remota: Il client richiede come parametri sulla riga di comando, l'indirizzo IP del server e la porta su cui contattarlo, stabilisce una connessione ed effettua una fase di autenticazione in cui risponde alla richiesta del server di inserire una password; ad autenticazione avvenuta con successo il client esegue un ciclo infinito in cui legge stringhe dallo standard input e invia al server i comandi da eseguire; Il server è concorrente ed accetta come unico parametro il numero di porta su cui accettare connessioni ponendosi in ascolto sull'indirizzo di loopback 127.0.0.1 (non utilizzare INADDR_ANY); Il server richiede ad ogni client una password verifica che corrisponda a quella contenuta in un file predefinito; successivamente il server riceve ed esegue i comandi inviati dal client inviandogli l'output prodotto; Il client termina l'esecuzione quando l'utente inserisce la stringa exit, mentre client e server terminano entrambi l'esecuzione quando l'utente inserisce la stringa close.