#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEFAULTPORT 1515 int ricevuto_sigusr1=0; int valoreT = 5 ; void sigusr1_handler(int signo) { ricevuto_sigusr1=1; printf("Ricevuto SIGUSR1: log attivo\n"); } void sigusr2_handler(int signo) { printf("Ricevuto SIGUSR2\n"); if(valoreT < 10) valoreT ++ ; printf("Ricevuto SIGUSR2: T ora vale %d\n",valoreT); } servizio(int sockfd) { char buffer[256],*mesg; int i,pid,status; int valoreN, valoreD; read(sockfd,buffer,sizeof(buffer)); sscanf(buffer,"%d",&valoreN); if(ricevuto_sigusr1) { printf("Ricevuto dal client : %d\n",valoreN); } if(valoreN <2 || valoreN>10) { mesg="Valore N fuori intervallo 2..10: chiudo connessione\n"; write(sockfd,mesg,strlen(mesg)+1); if(ricevuto_sigusr1) { printf("Inviato al client : %s\n", mesg); } } else { for(i=0;i1) { valoreT = atoi(argv[1]); if( valoreT < 2 || valoreT >10) valoreT = 5; } sig.sa_handler = sigusr1_handler; sigemptyset(&sig.sa_mask); sig.sa_flags=SA_RESTART; sigaction(SIGUSR1,&sig,NULL); sig.sa_handler = sigusr2_handler; sigaction(SIGUSR2,&sig,NULL); /* Crea la socket STREAM */ sock= socket(AF_INET,SOCK_STREAM,0); if(sock<0) { perror("opening socket: "); exit(1); } /* Name socket using wildcards */ server.sin_family = AF_INET; server.sin_addr.s_addr= INADDR_ANY; server.sin_port = htons(DEFAULTPORT); if (reuse) { int on = 1; // printf("setsockopt(SO_REUSEADDR)\n"); if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) { perror("setsockopt(SO_REUSEADDR) รจ fallita"); } } if (bind(sock,(struct sockaddr *)&server,sizeof server)<0) { perror("binding socket: "); exit(1); } /* Find out assigned port and print out */ length= sizeof server; if(getsockname(sock,(struct sockaddr *)&server,&length)<0) { perror("getsockname: "); exit(1); } printf("Server attivo sulla porta #%d\n",ntohs(server.sin_port)); /* Pronto ad accettare connessioni */ listen(sock,4); do{ /* Attesa di una connessione */ msgsock= accept(sock,(struct sockaddr *)&client,(int *)&length); if(fork()==0) { close(sock); servizio(msgsock); close(msgsock); exit(0); } else close(msgsock); } while(1); }