Advertisement
QenBau

server.c

Aug 2nd, 2021
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.15 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <signal.h>
  5. #include "utils.h"
  6. #include "conn.h"
  7. #include <ctype.h>
  8.  
  9. #define DIM_BUFFER 256
  10.  
  11. volatile sig_atomic_t termina = 0;
  12.  
  13. static void *clientFun();
  14. void gestioneSegnali();
  15. static void sigHandler();
  16.  
  17. int main()
  18. {
  19.  
  20.     gestioneSegnali();
  21.  
  22.     int fdSkt;
  23.     RETURN_SYSCALL(fdSkt, socket(AF_UNIX, SOCK_STREAM, 0), "Errore creazione socket - fdSkt")
  24.  
  25.     struct sockaddr_un sckAddr;
  26.     strncpy(sckAddr.sun_path, SOCKNAME, MAXBACKLOG);
  27.     sckAddr.sun_family = AF_UNIX;
  28.     SYSCALL(bind(fdSkt, (struct sockaddr *) &sckAddr, sizeof(sckAddr)), "Errore bind - fdSkt")
  29.  
  30.     SYSCALL(listen(fdSkt, SOMAXCONN), "Errore listen - fdSkt")
  31.  
  32.     int fdSkt_com;
  33.     while (termina == 0)
  34.     {
  35.         if((fdSkt_com = accept(fdSkt, NULL, 0)) == -1)
  36.         {
  37.             if(errno == EINTR)
  38.             {
  39.                 continue;
  40.             }
  41.             else
  42.             {
  43.                 perror("Errore: fdSkt_com = accept(fdSkt, NULL, 0)");
  44.                 exit(EXIT_FAILURE);
  45.             }
  46.         }
  47.  
  48.         pthread_t clientId;
  49.         THREAD_CREATE(&clientId, NULL, &clientFun, (void *) &fdSkt_com, "Thread setId")
  50.         SYSCALL_ZERO(pthread_detach(clientId) , "pthread_detach(&clientId)"); //lo chiedeva l'esercizio di usare la moditlià detached
  51. //        SYSCALL_ZERO(pthread_join(clientId, NULL) , "pthread_detach(&clientId)"); //lo chiedeva l'esercizio di usare la moditlià detached
  52.  
  53.     }
  54.  
  55.     //chiusura file descriptor
  56. //    SYSCALL(close(fdSkt_com), "Errore - close(fdSkt_com)")
  57.     SYSCALL(close(fdSkt), "Errore - close(fdSkt)")
  58.  
  59.     puts("Termino");
  60.     unlink(SOCKNAME);
  61.  
  62.     return 0;
  63. }
  64.  
  65. static void sigHandler()
  66. {
  67.     termina = 1;
  68. }
  69.  
  70. void gestioneSegnali()
  71. {
  72.     //i segnali da gestire vengono ignorati finché l'handler non è pronto
  73.     sigset_t mask, oldmask;
  74.     SYSCALL(sigemptyset(&mask), "Errore: sigemptyset(&mask)")
  75.     SYSCALL(sigaddset(&mask, SIGINT), "Errore: sigaddset(&mask, SIGINT)")
  76.     SYSCALL(sigaddset(&mask, SIGTERM), "Errore: sigaddset(&mask, SIGINT)")
  77.     SYSCALL(sigaddset(&mask, SIGQUIT), "Errore: sigaddset(&mask, SIGINT)")
  78.     SYSCALL(sigaddset(&mask, SIGHUP), "Errore: sigaddset(&mask, SIGINT)")
  79.     //guardare su notion per capire cosa amettere come primo argomento
  80.     SYSCALL_ZERO(pthread_sigmask(SIG_BLOCK, &mask, &oldmask), "Errore: Spthread_sigmask(SIG_BLOCK, &mask,&oldmask)")
  81.  
  82.  
  83.     //GESTIONE SIGINT
  84.     struct sigaction sigAct;
  85.     memset(&sigAct, 0, sizeof(sigAct)); //inizializza a 0 sSigAction (il prof non fa nessun controllo su memset)
  86.     sigAct.sa_handler = sigHandler; //registra l'handler
  87.  
  88.     SYSCALL(sigaction(SIGINT, &sigAct, NULL), "Errore sigaction(SIGINT, &sigAct, NULL)") //il 3 campo può essere != NULL
  89.     SYSCALL(sigaction(SIGTERM, &sigAct, NULL), "Errore sigaction(SIGINT, &sigAct, NULL)") //il 3 campo può essere != NULL
  90.     SYSCALL(sigaction(SIGQUIT, &sigAct, NULL), "Errore sigaction(SIGINT, &sigAct, NULL)") //il 3 campo può essere != NULL
  91.     SYSCALL(sigaction(SIGHUP, &sigAct, NULL), "Errore sigaction(SIGINT, &sigAct, NULL)") //il 3 campo può essere != NULL
  92.  
  93.  
  94.     //ripristino la maschera (se non lo facessi, non riusciarei a gestire i segnali con l'handler)
  95.     SYSCALL_ZERO(pthread_sigmask(SIG_SETMASK, &oldmask, NULL), "Errore: Spthread_sigmask(SIG_BLOCK, &mask,&oldmask)")
  96.  
  97. }
  98.  
  99. static void *clientFun(void *fdSkt_comF)
  100. {
  101.     int fdSkt_com = *((int *) fdSkt_comF);
  102.     char buffer[DIM_BUFFER];
  103.     memset(buffer, '\0', DIM_BUFFER);
  104.  
  105.     //"termina" is set to 1 by the signal handler when a signal arrives
  106.     while (termina == 0)
  107.     {
  108.         int lenghtRead;
  109.         RETURN_SYSCALL(lenghtRead, read(fdSkt_com, buffer, DIM_BUFFER), "Errore: read(fdSkt_com, buffer, DIM_BUFFER)")
  110.  
  111.         if(lenghtRead == 0)
  112.             break;
  113.  
  114.         //lenghtRead conta tutti i caretteri letti (compreso il '\0' se è presente)
  115.         for(int i = 0; i < lenghtRead-1; i++)
  116.         {
  117.             buffer[i] = toupper((unsigned char) buffer[i]);
  118.         }
  119.  
  120.         SYSCALL(writen(fdSkt_com, buffer, lenghtRead), "writen(fdSkt_com, buffer, lengthBuffer)")
  121.     }
  122.     puts("Ciao");
  123.     return NULL;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement