Advertisement
LeonidR

chat

Dec 11th, 2013
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.48 KB | None | 0 0
  1. //da eseguire come: dal primo terminale ./chat pippo paperino  dal secondo terminale ./chat paperino pippo
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. //mkfifo, open
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10.  
  11. //open
  12. #include <fcntl.h>
  13.  
  14. //read, write
  15. #include <unistd.h>
  16.  
  17. //signal
  18. #include <signal.h>
  19.  
  20.  
  21. char inpipe[20];
  22. char outpipe[20];
  23.  
  24. void safeClose(){
  25.     unlink(inpipe);
  26.     unlink(outpipe);
  27.     exit(1);
  28. }
  29.  
  30. int main(int argc, char const *argv[]){
  31.     //il programma deve essere chiamato con i due nickname altrimente termina
  32.     if(argc < 3){
  33.         perror("La chat deve partire con 2 argomenti: tuo nick, il nick del tuo interlocutore\n");
  34.         exit(1);
  35.     }
  36.  
  37.     //se ho i due nickname creo due pipe con i nomi di nickname
  38.     strcpy(inpipe, argv[1]);
  39.     strcpy(outpipe, argv[2]);
  40.  
  41.  
  42.     signal(SIGINT, safeClose); //se mi fermano con ctrl-c rimuovo le pipe
  43.  
  44.     //i nicknames devono essere diversi
  45.     if(!strcmp(inpipe, outpipe)){
  46.         perror("I nickname non devono essere uguali\n");
  47.         exit(1);
  48.     }
  49.  
  50.     //per convenzione il figlio scrive e il padre legge
  51.     int figlio;
  52.     char mess[100];
  53.  
  54.     //se la fork va male esco
  55.     if((figlio = fork()) < 0){
  56.         perror("Errore fork\n");
  57.         exit(1);
  58.     }
  59.  
  60.     //il figlio legge dalla pipe, quindi apre la inpipe in lettura
  61.     if(figlio == 0){
  62.         mkfifo(inpipe, 0666);
  63.  
  64.         int fd0;
  65.         //se non sono riuscito ad aprire la pipe esco con l'erore
  66.         if((fd0 = open(inpipe, O_RDONLY)) < 0){
  67.             perror("Errore apertura pipe");
  68.             exit(1);
  69.         }
  70.  
  71.         int i;
  72.         //sto in ascolto sulla pipe e scivo sul stdout il messaggio ricevuto
  73.         while(1){
  74.             i = 0;
  75.             //accumulo il messaggio
  76.             while((i < 100) && read(fd0, &mess[i], 1) && mess[i] && (mess[i++] != '\n'));
  77.  
  78.             /*
  79.              * una volta ricevuto il messaggio lo scrivo sul stdout ma se chiudo
  80.              * uno dei due interlocutori la read mi da 0 e stampa al infinito l'ultimo
  81.              * messaggio ricevuto quindi metto il controllo, se ho ricevuto 0 byte
  82.              * e sono passato del while significa che nessuno ci scriverà più sulla pipe
  83.              */
  84.             if(i)
  85.                 printf("[%s] %s\n", outpipe, mess);
  86.         }
  87.     }
  88.  
  89.     //qui arriva solo il padre che si mette in ascolto sul stdin, manda il mess sulla pipe
  90.     mkfifo(outpipe, 0666);
  91.  
  92.     int fd1;
  93.  
  94.     if((fd1 = open(outpipe, O_WRONLY)) < 0){
  95.         perror("Errore apertura pipe");
  96.         exit(1);
  97.     }
  98.  
  99.     while(1){
  100.         //da migliorare la parte del scanf in quanto manda una parola
  101.         //alla volta invece di una frase intera
  102.         scanf("%s", mess);
  103.         write(fd1, mess, strlen(mess)+1);
  104.     }
  105.  
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement