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);  }