next up previous contents
Next: Strutture dati del server Up: Manuale tecnico Previous: Manuale tecnico   Contents


Il server

Il server è un processo sempre attivo su un host ed è in attesa su una porta (per default 5000) per accettare una connessione da parte del client.

Tecnicamente il server viene creato dalla funzione CreateServer presente nel file server.c. Questa funzione ritorna il socket di tipo stream (chiamata socket) collegato (bind) alla porta specificata in port, attraverso il quale il processo server si mette in ascolto con la listen. Per consentire che più client si colleghino contemporaneamente, la listen è stata impostata con una coda di richieste pendenti PEND_CONN definita nel file config.h. Se la coda è piena il messaggio viene scartato (dropped). Inoltre chiamando la bind si compila la struttura sockaddr_in in modo da usare il protocollo Internet ARPA ed in modo da accettare connessioni da qualsiasi host.

Si garantisce poi attraverso la chiamata di sistema select che ogni client abbia la possibilità di colloquiare con gli altri facendo sì che il server possa in ogni momento verificare la provenienza di un messaggio dai client.

La select impone l'uso di un insieme di file descriptors e la sua funzione è quella di testare se un particolare fd appartiene o meno all'insieme. Il server, infatti, prepara l'insieme azzerandolo e vi aggiunge il proprio socket. In questo modo si può testare se arriva un messaggio da un client. Quando questo arriva viene eseguita la chiamata AcceptClient che non fa altro che accettare la connessione attraverso la accept, che preleva dalla coda una richiesta pendente e restituisce un nuovo socket. Questo nuovo socket viene poi aggiunto all'insieme di file descriptors che il server testa per vedere quale client sta comunicando. Fatto ciò si esegue un ciclo che scorre tutti i fd dell'insieme alla ricerca di una variazione (ossia di una scrittura di un particolare client) e quando ciò avviene si legge il messaggio che arriva (chiamata read) e lo si interpreta.

Il formato del messaggio che il client comunica al server è stato limitato a MSG_LEN, che vale 80. Questo per ragioni di semplicità. Il messaggio si compone di tre campi:

1.
Tipo di comando (I, X, M, P, N, W, K, T)
2.
Eventuali opzioni del comando
3.
Payload

Il primo campo forma l'header, il secondo ed il terzo il corpo del messaggio contenente i dati che il client vuole diffondere agli altri client collegati.

Abbiamo pensato di far sì che il campo specificante le eventuali opzioni del comando potesse esserci oppure meno, consentendo quindi, nel caso di assenza, un maggiore payload (dati).

Il tipo di comando può essere così interpretato:




next up previous contents
Next: Strutture dati del server Up: Manuale tecnico Previous: Manuale tecnico   Contents
Mirko Manea
2000-05-07