Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C/UNIX] Copia file in Applicazione Client/Server

    salve ragazzi, è qualche tempo che sto sbattendo la testa con questo programma..
    Praticamente ho un client e un server che dovrebbero interagire (e questo lo fanno) e in questo sistema di comunicazione il client cerca all'interno del server un file :
    1. Se il file è già prensete non lo sovrascrivo
    2. Se il file nn è presente lo copio dal server

    Il problema sta nel fatto che il file sì viene copiato! ma con dimensione 0kb!! e dunque risulta come se fosse corrotto...
    Ero sicuro del suo funzionamento fino a qualche giorno fa.. e ora che sono a ridosso dell'esame mi è venuto fuori sto problema (colpa mia chiaramente)

    Vi posto Client e Server
    codice:
    /*SERVER*/  /*La struttura è quella di un server concorrente, ma viene gestito come un server iterativo (vedi wait(…)) */  #include<stdio.h>  #include<fcntl.h>  #include<sys/types.h>  #include<sys/socket.h>  #include<netinet/in.h>  #include<netdb.h>  #define DIM_BUFF 256  int main ()  {  	int sd, ns, fd;  	char buff[DIM_BUFF];  	int fromlen, status, nread, count=0;  	struct sockaddr_in mio_indirizzo, rem_indirizzo;  	memset((char *)&mio_indirizzo,0,sizeof(struct sockaddr_in));  	fromlen=sizeof(struct sockaddr_in);sd=socket(AF_INET, SOCK_STREAM, 0);		/*socket d’ascolto*/  	if (sd<0) {  		perror ("aperture socket");  		exit(1);  	}  	mio_indirizzo.sin_family=AF_INET;  	mio_indirizzo.sin_port=12345; 							/*meglio htons(12345) */  	if(bind(sd,(struct sockaddr *)&mio_indirizzo,sizeof(struct sockaddr_in))<0) {  		perror("bind");           		exit(1);  	}  	listen(sd,5);  	chdir("/home/alessandro/Scrivania");  	for(;;) {  		ns=accept(sd,(struct sockaddr *)&rem_indirizzo,&fromlen);  		if(fork()!=0) {  			close(sd);							/* ricevo nome del file */  			read(ns, buff, DIM_BUFF);  			printf("il server ha letto %s \n", buff);  			if((fd=open(buff, O_WRONLY|O_CREAT|O_EXCL))<0) {  				printf("file esiste, non lo sovrascrivo \n");  				write(ns,"N",1);  			} else {  				printf("file non esiste, lo copio dal client \n");  				write(ns,"S",1);  				while(nread=read(ns, buff, DIM_BUFF>0)) {  					write(fd, buff, nread);  					count+=nread;  				}  				close(fd);  				printf("Copia eseguita di %d byte \n", count);  				write(ns, &count, sizeof(int));  			}  		}  		close(ns);  		exit(0);  	}  	close(ns);  	wait(&status);									//sequenzializza  }
    Client:
    codice:
    /*CLIENT*/  #include<stdio.h>  #include<fcntl.h>  #include<sys/types.h>  #include<sys/socket.h>  #include<netinet/in.h>  #include<netdb.h>  #define DIM_BUFF 256  int main (int argc, char *argv[])  {  	int sd, fd, nread;  	char buff[DIM_BUFF];  	int fromlen, copiati;  	struct hostent *host;								/*ptr a info per host remoto*/  	struct sockaddr_in rem_indirizzo;						/*per indirizzo socie remota*/  	if(argc!=3) {  		printf("Usage Error: %s nomenodo nomefile\n",argv[0]);  		exit(1);  	}  	memset ((char *)&rem_indirizzo,0,sizeof(struct sockaddr_in));			/*Preparazione indirizzo remoto a cui connettersi*/  	rem_indirizzo.sin_family=AF_INET;  	host=gethostbyname(argv[1]);  	if(host==NULL) {  		printf("%s not found in /etc/hosts\n", argv[1]);  		exit(2);  	}  	bcopy((char *)host ->h_addr, (char *)&rem_indirizzo.sin_addr,host->h_length);	  	rem_indirizzo.sin_port=12345;  	sd=socket(AF_INET, SOCK_STREAM,0);  	if(connect(sd,(struct sockaddr *)&rem_indirizzo,sizeof(struct sockaddr))<0) {  		perror("Errore in connect");  		exit(1);  	}  	if(write(sd, argv[2],strlen(argv[2]))<0) {  		perror("write");  		exit(1);  	}  	nread=read(sd,buff, DIM_BUFF);  	if (nread<0) {  		perror("read");  		exit(1);  	}  	if(buff[0]=='S') {  		if((fd=open(argv[2],O_RDONLY))<0) {  			perror("open");  			exit(1);  		}  		while((nread=read(fd, buff, DIM_BUFF))>0)  			write(sd, buff, nread);  		shutdown(sd,1); 							/* ho spedito il file */  		printf("File spedito \n");  		memset((char *)buff,0,10);  		if((nread=read(sd,&copiati,sizeof(int)))<0) {  			perror("read");  			exit(1);  		}  		write(1,"buff",4);  		printf("server ha scritto %d byte \n", copiati);  	} else  		printf("File esiste,termino \n");  	close(sd);  	exit(0);  }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Ciao, scusa se ti sembrerò rompiscatole, ma puoi postare il codice in maniera corretta?
    Del tipo:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
       ...
    }
    È che non si capisce niente come lo hai postato, plz

    Cmq vedi un pò qui sendfile

  3. #3
    codice:
    /*SERVER*/  /*La struttura è quella di un server concorrente, ma viene gestito come un server iterativo (vedi wait(…)) */  
    #include<stdio.h>  
    #include<fcntl.h>  
    #include<sys/types.h>  
    #include<sys/socket.h>  
    #include<netinet/in.h>  
    #include<netdb.h>  
    #define DIM_BUFF 256  
    int main ()  {  	
       int sd, ns, fd;  	
       char buff[DIM_BUFF];  	
       int fromlen, status, nread, count=0;  	
       struct sockaddr_in mio_indirizzo, rem_indirizzo;  	
       memset((char *)&mio_indirizzo,0,sizeof(struct sockaddr_in));  	
       fromlen=sizeof(struct sockaddr_in);sd=socket(AF_INET, SOCK_STREAM, 0);		/*socket d’ascolto*/  	
       if (sd<0) {  		
                    perror ("aperture socket");  		
                    exit(1);  	
                    }  	
       mio_indirizzo.sin_family=AF_INET;  	                mio_indirizzo.sin_port=12345; 		/*meglio htons(12345) */  	
    
    if(bind(sd,(struct sockaddr *)&mio_indirizzo,sizeof(struct sockaddr_in))<0) {  		  
    
    perror("bind");           		
    exit(1);  	
    }  	
    listen(sd,5);  	
    chdir("/home/alessandro/Scrivania");  	
    for(;;) {
    		ns=accept(sd,(struct sockaddr *)&rem_indirizzo,&fromlen);
    		if(fork()!=0) {
    			close(sd);							/* ricevo nome del file */
    			read(ns, buff, DIM_BUFF);
    			printf("il server ha letto %s \n", buff);
    			if((fd=open(buff, O_WRONLY|O_CREAT|O_EXCL))<0) {
    				printf("file esiste, non lo sovrascrivo \n");
    				write(ns,"N",1);
    			} else {
    				printf("file non esiste, lo copio dal client \n");
    				write(ns,"S",1);
    				while(nread=read(ns, buff, DIM_BUFF>0)) {
    					write(fd, buff, nread);
    					count+=nread;
    				}
    				close(fd);
    				printf("Copia eseguita di %d byte \n", count);
    				write(ns, &count, sizeof(int));
    			}
    		}
    		close(ns);
    		exit(0);
    	}
    	close(ns);
    	wait(&status);									/*sequenzializza…*/
    }
    NB: Cé un for ( ; ; ) che a causa delle faccine è stato sostituito da un occhiolino


    codice:
    /*CLIENT*/
    #include<stdio.h>
    #include<fcntl.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>
    #define DIM_BUFF 256
    int main (int argc, char *argv[])
    {
    	int sd, fd, nread;
    	char buff[DIM_BUFF];
    	int fromlen, copiati;
    	struct hostent *host;								/*ptr a info per host remoto*/
    	struct sockaddr_in rem_indirizzo;						/*per indirizzo socie remota*/
    	if(argc!=3) {
    		printf("Usage Error: %s nomenodo nomefile\n",argv[0]);
    		exit(1);
    	}
    	memset ((char *)&rem_indirizzo,0,sizeof(struct sockaddr_in));			/*Preparazione indirizzo remoto a cui connettersi*/
    	rem_indirizzo.sin_family=AF_INET;
    	host=gethostbyname(argv[1]);
    	if(host==NULL) {
    		printf("%s not found in /etc/hosts\n", argv[1]);
    		exit(2);
    	}
    	bcopy((char *)host ->h_addr, (char *)&rem_indirizzo.sin_addr,host->h_length);	
    	rem_indirizzo.sin_port=12345;
    	sd=socket(AF_INET, SOCK_STREAM,0);
    	if(connect(sd,(struct sockaddr *)&rem_indirizzo,sizeof(struct sockaddr))<0) {
    		perror("Errore in connect");
    		exit(1);
    	}
    	if(write(sd, argv[2],strlen(argv[2]))<0) {
    		perror("write");
    		exit(1);
    	}
    	nread=read(sd,buff, DIM_BUFF);
    	if (nread<0) {
    		perror("read");
    		exit(1);
    	}
    	if(buff[0]=='S') {
    		if((fd=open(argv[2],O_RDONLY))<0) {
    			perror("open");
    			exit(1);
    		}
    		while((nread=read(fd, buff, DIM_BUFF))>0)
    			write(sd, buff, nread);
    		shutdown(sd,1); 							/* ho spedito il file */
    		printf("File spedito \n");
    		memset((char *)buff,0,10);
    		if((nread=read(sd,&copiati,sizeof(int)))<0) {
    			perror("read");
    			exit(1);
    		}
    		write(1,"buff",4);
    		printf("server ha scritto %d byte \n", copiati);
    	} else
    		printf("File esiste,termino \n");
    	close(sd);
    	exit(0);
    }
    Scusa io che l'ho messo a cavolo!! guarda io ora sono su un pc sprovvisto di unix.. però l'errore è sempre che il file lo copia.. ma lo copia di dimensioni zero!

    Grazie anche solo per la risposta!

  4. #4
    Ah, per farlo funzionare, se per caso qualcuno lo facesse:

    Compli Client, server
    Esegui Server
    Esegui Client e vicino scrivi l'indirizzo del server e il nome del file da copiare , esempio: Client1 127.0.0.1 file.doc

    Ciao!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Non ho letto in dettaglio tutto il codice, ma a parte il fatto che mancano diversi header file (stdlib.h, string.h, unistd.h, sys/wait.h) c'è questa riga del server che è sicuramente sbagliata da un punto di vista "semantico", non sintattico:

    codice:
    while(nread=read(ns, buff, DIM_BUFF)>0) {
    in pratica significa: "a nread assegna il valore booleano di read(...) > 0", quindi nread varrà sempre 0 o 1 e non il numero di byte letti...

    codice:
    while ((nread = read(ns, buff, DIM_BUFF)) > 0) {
    Questo è sicuramente da aggiustare, controlla se non hai fatto lo stesso errore anche altrove.
    every day above ground is a good one

  6. #6
    Intanto ti ringrazio-credo che il C si meriti una conoscenza più ampia da parte mia- e appena torno a casa lo proverò.

    La mia paura è che otlre quell'errore ce ne siano altri

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    L'ho provato e dovrebbe andare, questo ovviamente apportando quella correzione e preferibilmente aggiungendo gli header file mancanti di cui ti dicevo. Inoltre, c'è un piccolo problema nell'invio del nome del file al server:

    codice:
    read(ns, buff, DIM_BUFF);
    ti consiglio vivamente di aggiustare così:

    codice:
    nread = read(ns, buff, DIM_BUFF);
    buff[nread] = '\0';
    altrimenti il server in buff avrà il nome del file tra i primi caratteri e poi una serie di byte sporchi. Inoltre visto che, se il server non ha il file, lo crea, nella open() andrebbero considerati anche i permessi da impostare sul file come terzo argomento.
    every day above ground is a good one

  8. #8
    Questa sera proverò le tue modifiche sperando funzioni come dici

    Lo spero vivamente perchè domani devo consegnarlo per l'esame.

    Comunque vada -che funzioni o non funzioni- un sentitissimo grazie per la disponibilità e per avermi fatto capire quanto il C ha da mostrare ai meno esperti!


  9. #9
    Comunque implementare un protocollo di comunicazione, è molto utile per stutturare la comunicazione e dargli la flessibilità di un linguaggio potevi fare così:
    codice:
    OPEN COMMUNICATION
    FILENAME file.c
    CONTENT 512byte
    bynary data 512byte
    END COMMUNICATION
    Così li davi una struttura alla comunicazione che rendeva la communicazione più flessibile.

  10. #10
    Originariamente inviato da menphisx
    Comunque implementare un protocollo di comunicazione, è molto utile per stutturare la comunicazione e dargli la flessibilità di un linguaggio potevi fare così:
    codice:
    OPEN COMMUNICATION
    FILENAME file.c
    CONTENT 512byte
    bynary data 512byte
    END COMMUNICATION
    Così li davi una struttura alla comunicazione che rendeva la communicazione più flessibile.
    Mi sa tutto questo a lezione non l'abbiamo visto, cmq ti ringrazio per il supporto
    Forse il programma funziona! a domani mattina la conferma!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.