Progettare, codificare in linguaggio C e collaudare un programma eseguito da un processo padre SRV e da due processi server SRV_X (1 o 2).
Ciascun processo SRV_X gestisce un canale CNL_X tra se stesso e un cliente di verifica CLI_X. Il problema utilizza l’allegato ‘term.txt’:
1)SRV ha il ruolo di server studente e deve servire in parallelo due richieste di servizio da parte di due clienti di verifica diversi CLI_X.
2)SRV si pone in attesa di collegamento da parte dei processi CLI_X sulla porta TCP XXXXX.
3)Per una generica richiesta di connessione X, SVR_X utilizza il canale di rete CNL_X aperto con CLI_X per eseguire i processi seguenti:
a)SRV_X entra in un ciclo nel quale svolge le seguenti azioni:
I)Riceve da CLI_X, sul canale CNL_X, una sequenza di caratteri terminata dal carattere newline (‘\n’) e di lunghezza massima 5. Tale sequenza, convertita in formato numerico, rappresenta un indice IDX (vedi nota per la conversione).
II)Apre il file ‘term.txt’, ricevuto come allegato al testo del problema, legge il carattere alla posizione IDX e lo memorizza, quindi chiude il file. Il carattere letto, indicato nel seguito come CH_TERM, ha il significato di ‘terminatore’ per i messaggi successivi.
III)Riceve da CLI_X, sul canale CNL_X, una sequenza di caratteri CH_SEQ di lunghezza max 64, il cui ultimo carattere è il ‘terminatore’ CH_TERM precedentemente letto da file.
IV)Conta il numero di caratteri della sequenza CH_SEQ, compreso il carattere ‘terminatore’ CH_TERM.
V)Invia a CLI_X, sullo stesso canale CNL_X, il numero di caratteri ricevuti, compreso il carattere ‘terminatore’ CH_TERM (vedi nota per la conversione).
b)Il ciclo termina quando SRV_X legge dal file un carattere terminatore CH_TERM uguale a ‘q’.
c)Il processo SRV_X chiude il canale di rete CNL_X e termina.
4)Il processo SRV_X non attende il termine dei servizi, ma chiude il canale usato e termina.
Si tenga presente che:
I clienti di verifica CLI_X funzionano sempre correttamente.
I clienti di verifica CLI_X si aspettano di ricevere la corretta lunghezza della stringa inviata CH_SEQ.
Per la conversione di una sequenza di caratteri numerici nel corrispondente valore interno si utilizzi la funzione:
int atoi(char *str);
Il numero da inviare deve essere convertito in una sequenza di caratteri terminata da newline (‘\n’). Utilizzare per la conversione la funzione ‘sprintf’:
int sprintf(char *buffer, char *format, [argument, …]);
Per la conversione utilizzare come specificatore di formato la stringa “%d\n”.
Se i clienti di verifica CLI ricevono dati diversi da quelli attesi, essi chiudono il canale CNL e terminano immediatamente.