Programma Client-Server in C

di il
4 risposte

Programma Client-Server in C

Salve a tutti ,
avrei da fare due programmi uno client e uno server che devono essere composti in questa maniera :
server.c :
-Riceve in ingresso (da riga di comando all’avvio) il path nel quale si vorrà andare a creare la FIFO. Qualora non venga specificato nulla la FIFO verrà creata in /tmp. (la riga di comando sarà tipo: server /home/drago )
- Crea una FIFO in lettura alla locazione fornita.
- Attende fino a quando non riceve un messaggio sulla FIFO.
- In sequenza sulla FIFO leggerà:
-1 la destinazione sui cui andare a scrivere le risposte al Client.
-2 il comando da eseguire per conto del Client.
- A questo punto il Server mediante Fork crea un processo figlio.
- Il padre comunica con il processo figlio mediante una PIPE.
- Il processo figlio dovrà:
-Eseguire il comando ricevuto dal Client.
-Ritornare il risultato dell'esecuzione del comando al padre mediante la PIPE.
- Se il comando ricevuto dal Client è “quit”, il Server dovrà eseguire la procedura di terminazione, che comprende:
-Uccidere tutti i processi figlio ancora in esecuzione.
- Chiudere la FIFO di lettura.
- Inviare su eventuali FIFO dei Client, in attesa di risposta dal server, il comando “disconnected”.
- Il padre dovrà accertarsi che non rimangano in vita nessun figlio, quindi dovrà occuparsi di ucciderli.
- Alla fine il padre dovrà terminare anche lui, dopo aver rimosso la FIFO da lui creata (quella in lettura).
client.c:
- Riceve in ingresso (da riga di comando all’avvio) il path dove è presente la FIFO del SERVER dove inviare i comandi e il path nel quale si vorrà andare a creare la FIFO per le risposte del server. Qualora non venga specificato nulla la FIFO verrà creata in /tmp. (la riga di comando sarà tipo: client /home/server/FIFOServer /home/drago )
- Deve creare una FIFO (per ricevere le risposte dal server)
- Deve scrivere sulla FIFO due volte:
- 1 la destinazione su cui poi il client andrà ad attendere la risposta del Server.
- 2 il comando da eseguire sul server.
- Attendere su di una FIFO specifica la risposta del Server.
- Se la risposta è “disconnected”, notificare la disconnessione prematura da parte del Server.

Sono convinto che il programma di per sè non sia cosi complicato da implementare ,ma siccome non ho mai avuto l'occasione di programmare in C trovo che la sua implementazione sai alquanto complicata .
Se qualcuno riuscisse a darmi una mano sarebbe molto ben apprezzato il gesto.

4 Risposte

  • Re: Programma Client-Server in C

    Una mano in che senso ... ?

    La scrittura dei programmi non è comunque banale e ci vuole tempo. Tu cosa proponi?
  • Re: Programma Client-Server in C

    Allora io ho scritto questo pezzo di codice ma non so se sia corretto o meno e in piu sono bloccato al punto in cui il server riceve il messaggio dal client
    #include <fcntl.h>
    #include <stdio.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <include.h>
    
    #define Path_SIZE 128
    char fifoServer[PATH_SIZE] = "/tmp/FifoServer";
    char fifoServer[PATH_SIZE];
    
    int main(int argc, char *argv[])
    {
    	if (argc == 2)
    	{
    		fifoServer = argv[1];
    		}
    	int status;
    	int client_to_server;
    	int server_to_client;
    	int son_to_father[2];
    	int father_to_son[2];
    	char buf[BUFSIZE];
    	
    	/*create the fifo */
    	mkfifo(fifoServer,0666);
    	while (1) {
    		msgrcv(msgid,&msg_read,sizeof(int),1,MSG_NOERROR); /*si mette in attesa finchè non riceve un messaggio di dimensione 1 */
    		msg_write.mytipe=msg_read.pid;
    		msgnd(msgid,&msg_write,size,0);/*se non ci sono messaggio si msgrcv si bloccherà fino a quando non si immetterà un messaggio nella coda di msgrcv */
    		}
    		
    	pipe(father_to_son);/*creo la pipe da padre a figlio*/
    	pipe(son_to_father);/*creo la pipe da figlio a padre*/
    	if ((status=fork())==-1)
    		syserr(argv[0],"fork() fallita");
    	else
    		if(status==0){/*figlio*/
    			close(father_to_son[1])/*chiudo fase scrittura della pipe da padre a figlio */
    			close(son_to_father[0]);/*chiudo fase scrittura della pipe da figlio a padre*/
    			write(son_to_father[1];/*messaggio di risposta*/;BUFSIZE)/*inserisco nella pipe di risposta del figlio il risultato dell'azione che mi era stat imposta di fare dal client*/
    			if(read(father_to_son[0],buf,BUFSIZE)==-1)/*controllo che il read della pipe da padre a figlio sia andato a buon fine */
    				syserr(argv[0],"read() fallito");
    			printf ("Figlio ha ricevuto : %s \n",buf);
    			exit(0);
    		}else {/*padre*/
    			close(father_to_son[0]);/*chiudo fase lettura della pipe da padre a figlio*/
    			close(son_to_father[1];/*chiudo fase scrittura della pipe da figlio a padre*/
    			write(father_to_son[1];/*messaggio del client*/,BUFSIZE);/*inserisco nella pipe che passo al figlio il messaggio del client*/
    			if(read(son_to_father[0],buf,BUFSIZE)==-1)/*controllo che il read della pipe da figlio a padre sia andato a buon fine */
    				syserr(argv[0],"read() fallito");
    			printf("Padre ha ricevuto : %s \n",buf)
    			wait(%status);
    			exit(0);
    			}
  • Re: Programma Client-Server in C

    Così è difficile aiutarti. Nel forum devi mostrare un determinato problema con del codice, non genericamente dire che sei bloccato.
  • Re: Programma Client-Server in C

    Ok, hai ragione allora in questo pezzo di codice qua come faccio a dire che finche non riceve un messaggio che contiene l'ordine di esecuzione di un operazione continuo a far ciclare il while ?? Perchè correggimi se sbaglio ma questo codice inserito anche se riceve solamente un messaggio qualsiasi dal client esce dal ciclio while o?
    while (1) {
          msgrcv(msgid,&msg_read,sizeof(int),1,MSG_NOERROR); /*si mette in attesa finchè non riceve un messaggio di dimensione 1 */
          msg_write.mytipe=msg_read.pid;
          msgnd(msgid,&msg_write,size,0);/*se non ci sono messaggio si msgrcv si bloccherà fino a quando non si immetterà un messaggio nella coda di msgrcv */
          }
Devi accedere o registrarti per scrivere nel forum
4 risposte