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