Salve a tutti,
ho realizzato una banale applicazione client-server in cui un client scrive su la fifo inizializzata dal server il nome di un file e il nome della fifo dove vuole ricevere la risposta. Il server controlla se è presente il file nella directory corrente e risponde al client con 'Y' o 'N' a seconda se il file sia presente o meno. Le printf che trovate nel codice non hanno funzione specifiche ma sono state messe da me per una sorta di debug. Prima di postare il codice vi dico sin da subito che il client si blocca sulla read, subito dopo aver stampato a video pipe "server".
codice:
SERVER
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
/* struttura contenente il messaggio inviato dal client*/
typedef struct{
char nomePipe[20];
char nomeFile[20];
}messaggio;
/* controlla se il file è presente nella directory corrente identificata da "."
se è presente restituisce 1; 0 altrimenti*/
int presente(char *fileName){
int result=1;
DIR *dp;
struct dirent *dit;
dp = opendir(".");printf("ma na capito");
while((dit = readdir(dp)) !=NULL){
printf("%s",dit->d_name);
if(strcmp(dit->d_name,fileName)==0)
return result;
}
result = 0;
return result;
}
int main(){
int serverPipe,fd,byte,pid,clientPipe,wr,b,c;
messaggio m;
char risposta[2];
//signal(SIGTERM,disconnetti(m));
//signal(SIGINT,disconnetti(m));
serverPipe = mkfifo("server",O_CREAT|0666); //creazione FIFO
if(serverPipe==-1){
printf("Errore nella creazione della named pipe server");
exit(0);
}
fd = open("server",O_RDWR); //apertura FIFO in lettura e scrittura
while(1){
byte = read(fd,&m,sizeof(messaggio));
if(byte!=0){
pid = fork();
if(pid==0){
// sono nel processo figlio
wr = open(m.nomePipe,O_WRONLY);
printf("%s\n",m.nomeFile);
printf("%s\n",m.nomePipe);
if(presente(&m.nomeFile)==1){
printf("ciao\n");
risposta[0] = 'Y';
b = write(wr,risposta,2);
printf("ciao\n");
close(wr);
}
else{
printf("prima\n");
risposta[0]='N';
c = write(wr,risposta,2);
close(wr);
}
exit(0);
}//prima if
}//seconda if
}
}
void disconnetti(messaggio m){
fflush(stdout);
unlink(m.nomePipe);
printf("fatto\n");
exit(0);
}
CLIENT
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <fcntl.h>
typedef struct{
char nomeFile[20];
char nomePipe[20];
}messaggio;
int main(){
messaggio m;
char response[10];
int pipeClient,openServer,a,b,c;
printf("Inserire nome del file da trovare\n");
scanf("%s",&m.nomeFile);
printf("Inserire nome della pipe da creare\n");
scanf("%s",&m.nomePipe);
// creo pipe client
pipeClient = mkfifo(m.nomePipe,O_CREAT|0666);
if(pipeClient==-1){
printf("non riuscito");
}
openServer = open("server",O_WRONLY);
a = write(openServer,&m,sizeof(m));
printf("pipe server\n");
close(openServer);
b = open(m.nomePipe,O_RDONLY);
c = read(b,&response,2);
printf("pipe client\n");;
close(b);
unlink(m.nomePipe);
}