back , next , home


Il programma

Il programma e’ composto da due demoni, in ascolto su differenti porte TCP. Un demone e’ incaricato di occuparsi delle richieste degli utenti (demone-c) mentre un altro provvede al coordinamento con gli altri server (demone-s). L’ elenco dei server che partecipano alla rete deve essere contenuto in un file (server.txt).

 

  • Il demone-c:

    In ascolto sulla porta 3000 TCP, svolge la funzione di server concorrente parallelo. Per ogni richiesta genera un processo figlio; sono accettati, da una generica connessione tramite Telnet, i comandi group, post, article, quit il cui significato e’ riportato nel listato del programma. Il contenuto di un messaggio ricevuto e’ conservato in un file il cui nome, che rappresenta anche il nome del post, e’ scelto in modo da essere unico (ad una stringa contenente l’indicazione del tempo di ricezione e’ concatenato il nome del server). Ogni messaggio postato da un utente sarà leggibile dagli altri frequentatori del newsgroup solamente quando sarà presente in tutte le macchine server (escluse, ovviamente, quelle guaste). E’ necessario quindi conservare i messaggi che arrivano tra la fase di coordinamento precedente e quella successiva in una directory separata (\temp).

     

  • Il demone-s:

    In ascolto sulla porta 3000 TCP, utilizzare anche le porte 3001 TCP e 31337 UDP. Questo demone fa uso delle risorse di rete esclusivamente nella fase di coordinamento. Tale fase si attiva alla scadere di un time-out ed impone ad ogni macchina di procurarsi i nuovi messaggi presenti nelle altre, al fine di aggiornare i propri dati. Tali messaggi viaggiano in un file compresso, allo scopo di velocizzarne la trasmissione (sebbene un errore nel file comporti la perdita di tutti i messaggi che vi sono stivati). Una richiesta di connessione sulla porta 3000 TCP indica che una delle macchine server necessita del file sopra menzionato e avvia la fase di coordinamento nel caso questa non sia già’ stata innescata da un altro nodo. Quando viene attivata la fase di coordinamento la macchina deve immediatamente richiedere i files dei nuovi dati appartenenti agli altri server e lo fa’ attraverso la porta 3001 TCP aprendo una socket per ogni richiesta. La scelta di utilizzare due porte per lo scambio dei dati e’ legata alla semplificazione del protocollo di coordinamento, non e’ necessario specificare alcuna priorità’ nella comunicazione, banalmente ogni server richiede tutti i file che gli sono necessari attraverso una porta e nel frattempo rende disponibile i propri dati agli altri tramite un’altra porta. Il risultato delle connessioni (file richiesti e file inviati) viene memorizzato in due vettori (rich_guasti e sped_guasti), tramite l’analisi di questi e’ possibile sapere quali macchine non sono disponibili (una macchina dalla quale non e’ stato possibile ricevere dati o che non ne abbia richiesti viene considerata guasta). Il passo finale della fase di aggiornamento consiste nella propagazione, tramite una socket datagram associata alla porta 31337 UDP, della conoscenza che ha il server dello stato degli altri server (vettore final_vet ottenuto dalla elaborazione dei vettori rich_guasti e sped_guasti) in modo da ridurre la probabilità’ che un nodo offra informazioni che altri non possiedono. La durata di questa azione deve essere finita, per questo motivo la recvfrom che raccoglie le risposte e’ resa non bloccante tramite l’ utilizzo della primitiva select con time-out.

    Dopo un numero finito di trasmissioni di pacchetti udp e di attese delle relative risposte i messaggi contenuti nei file ricevuti e in quello locale vengono resi disponibili ai client richiedenti (scompattazione nella directory \ng_x). La fase di aggiornamento e’ considerata conclusa.


  • back , next , home