Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Esame di
Numero di Thread utilizzati: 3 errorsManager (gestione degli errori) transmitter (invio pacchetti) receiver (ricezione pacchetti) Motivazioni: Aumento delle prestazioni (invio e ricezione simultanei) Thread specializzati su un compito pi specifico Migliore leggibilit del codice
transmitter
APP
receiver
errorsManager
Analisi transmitter Per ogni richiesta di invio dati: Suddivide il messaggio in n pacchetti di 512 byte, comprensivi di header e data Invia i pacchetti uno dopo l'altro, in caso di errore lo sottopone
all'errorsManager Terminata con successo una richiesta di invio e soddisfa sequenzialmente tutte le altre richieste rimanenti. Se la trasmissione si interrompe quando mancano t pacchetti alla fine, attende che l'errorsManager la ripristini e continua ad inviare i rimanenti n-t pacchetti (non necessario rinviare tutti i dati in caso di ripristino) Ripristino affidato all'errorsManager (transmitter non contiene codice aggiuntivo inutile per ripristino) Analisi receiver Il receiver: Riceve i pacchetti (indipendentemente delle connessioni) e li smista nei buffer appropriati Se la connessione cade durante la ricezione di un pacchetto, si comunica all'errorsManager di ripristinarla per poi ritentare la ricezione Analisi errorsManager L'errorsManager: Lavora su un insieme di file descriptors: ripristina sequenzialmente un file descriptor alla volta nell'insime. Per ogni connessione ripristinata si comunica al thread appropriato di ripartire e si passa al ripristino del prossimo fd Ripristino affidato sempre all'errorsManager (codice ri ripristino implementato solo una volta per tutti i thread) Implementato il maccanismo degli IDS (Identificatori di Sessione): per ogni ripristino di connessione Server e Client si scambiano un intero prestabilito per capire se si tratta di un tentativo di riconnessione da una richiesta di nuova connessione Informazioni aggiuntive
Write() non bloccante come da consegna: passa i dati al transmitter che li invier all'altro end-system Read() attende che il receiver abbia riempito il buffer di ricezione in modo da poter leggere
Si sono implementate varie utility per semplificare la stesura del codice: Buffer utilities: gestine dei buffer (inserimento, cancellazione etc...) Conditions utilities: gestione concorrenza (initCondition, waintOnCondition, signalOnCondition) Lists utilities: gestione delle liste (remove, insert, get etc...) FIFO utilities: gestione code (initFifo, fifoInqueue, fifoDequeue)