chat : Analisi e progettazione Server - Owanesh/unifi-eos GitHub Wiki

Il processo server verifica inizialmente che non esista già un processo server operativo nella stessa cartella di esecuzione, in caso di esito operativo il processo server crea la pipe “server_pipe” e la apre in lettura, dopo di che si pone in attesa di eseguire i comandi ricevuti dai clients che si connetteranno. Sul terminale del processo server viene stampato costantemente un log delle operazioni eseguite. Per ogni nuovo client che si connette, il server è incaricato di creare e aprire in scrittura la pipe associata all’utente che avrà il seguente nome: “<pid_client>_client_pipe” (dove <pid_client> indica il pid del nuovo utente); il client in questo modo può aprire la propria pipe in lettura.

Il server esegue una lettura bloccante sulla server_pipe fino a che esiste almeno un client connesso (altrimenti esegue una lettura analoga ad “un’attesa attiva”) e può essere terminato attraverso il segnale SIGINT (^C) lanciato dall’utente. Il server è incaricato di rimuovere sia server_pipe che tutte le client_pipe dal file system una volta terminata al sessione.

Per poter comunicare correttamente le richieste dei clients, ogni messaggio rispetta una precisa sintassi in base al tipo di comando; in particolare si adopera una parola chiave iniziale che identifica univocamente il comando che il server deve eseguire, si riporta una breve sintesi che viene approfondita nella sezione implementativa successiva:

  • CONNECT <pid_client>” : richiesta di connessione da parte del client identificato da <pid_client>;
  • LIST <pid_client>” : richiesta di acquisizione della lista di tutti i clients connessi;
  • MSG <pid_clients_destinatari> $<pid_mittente> ” : invio di un messaggio verso un numero arbitrario di destinatari;
  • DISCONNECT <pid_client>" : richiesta di disconnessione dal server.

Ogni campo di un comando è separato da uno spazio, ogni comando termina con ‘\0’.

⚠️ **GitHub.com Fallback** ⚠️