Sì ma con quelle correzioni funzionava solo il trasferimento, ora che ho rivisto ci sono errori anche in come è strutturato il server concorrente: una volta creato un nuovo processo, il server deve affidare a quest'ultimo la comunicazione con il client mentre il processo padre deve rimettersi in ascolto sulla socket, quindi la struttura deve essere in linea di massima:
codice:
while (1) { /* o for (; ;) */
ns = accept(...);
if (fork() == 0) {
/* gestione della connessione da parte del processo figlio */
} else {
/* chiusura della socket per la connessione al client */
}
Posto il codice con tutte le correzioni, a me funziona... ho impostato come diritti sul file creato quelli di scrittura, lettura ed esecuzione per il proprietario, per il resto niente. Ho eliminato la wait() perché non ho capito a cosa dovesse servire...
codice:
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include<fcntl.h>
#include <unistd.h>
#include<sys/types.h>
#include <sys/stat.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#define DIM_BUFF 256
int main (void)
{
int sd, ns, fd;
char buff[DIM_BUFF];
int fromlen, 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;
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,(socklen_t *) &fromlen);
if(fork() == 0) {
close(sd); /* ricevo nome del file */
nread = read(ns, buff, DIM_BUFF);
buff[nread] = '\0';
printf("il server ha letto %s \n", buff);
if((fd=open(buff, O_WRONLY|O_CREAT|O_EXCL, S_IRWXU))<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);
} else {
close(ns);
}
}
exit(0);
}
codice:
/*CLIENT*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.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 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);
}