Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Cliente.c
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include "srvfile.h"
- #define exit_on_error(s,m) if (s < 0) { perror(m); exit(1); }
- void main()
- {
- struct t_request request;
- char buffer[MAX_BUFFER],n_fifocli[10];
- int fsrv,fcli,ffile,n;
- printf("File?");
- scanf("%s",request.n_file);
- request.pid=getpid();
- sprintf(n_fifocli,"%d",getpid());
- fcli=mkfifo(n_fifocli,0666);
- exit_on_error(fcli,"Criação do FIFO");
- fsrv=open(n_fifosrv,O_WRONLY);
- exit_on_error(fsrv,"Abertura do FIFO");
- write(fsrv,&request,sizeof(request));
- close(fsrv);
- fcli=open(n_fifocli,O_RDONLY);
- exit_on_error(fcli,"Abertura do FIFO");
- while((n=read(fcli,&buffer,sizeof(buffer))) > 0)
- write(1,&buffer,n);
- close(fcli);
- unlink(n_fifocli);
- }
- //Server.c
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <signal.h>
- #include "srvfile.h"
- #define exit_on_error(s,m) if (s < 0) { perror(m); exit(1); }
- int fsrv,fcli,ffile,n;
- void closefifo(int sinalrecebido)
- {
- close(fsrv);
- unlink(n_fifosrv);
- printf("\nFIFO FECHADO\n");
- }
- void childclose(int sin)
- {
- int status;
- while(waitpid(-1, &status, WNOHANG) > 0);
- }
- void main()
- {
- struct t_request request;
- char error[] = "Ficheiro Inexistente\n";
- char buffer[MAX_BUFFER],n_fcli[10];
- signal(SIGINT,closefifo);
- signal(SIGCHLD,childclose);
- unlink(n_fifosrv);
- n=mkfifo(n_fifosrv,0666);
- exit_on_error(n,"Erro a criar o FIFO");
- fsrv=open(n_fifosrv,O_RDWR);
- exit_on_error(fsrv,"Abertura do FIFO");
- while(read(fsrv,&request,sizeof(request)) > 0)
- {
- printf("PID:%d FILE:%s\n",request.pid,request.n_file);
- if(fork() == 0)
- {
- ffile=open(request.n_file,O_RDONLY);
- sprintf(n_fcli,"%d",request.pid);
- fcli=open(n_fcli,O_WRONLY);
- if(ffile < 0)
- {
- write(fcli,&error,sizeof(error));
- close(fcli);
- exit_on_error(ffile,"Abrir Ficheiro ");
- }
- while((n=read(ffile,&buffer,sizeof(buffer))) > 0)
- {
- sleep(1);
- write(fcli,&buffer,n);
- }
- close(ffile);
- close(fcli);
- exit(0);
- }
- }
- }
- //srvfile.h
- /*Nome do FIFO*/
- #define n_fifosrv "SRVFIFO"
- /*Tam. Máximo para nome de ficheiro*/
- #define MAX_FILE 50
- /*Tam. do buffer*/
- #define MAX_BUFFER 100
- /*Estrutura de dados para pedido ao servidor*/
- struct t_request
- {
- int pid;
- char n_file[50];
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement