#include #include #include #include #include #include #include #include #include #include #include #include #include #define DEFAULTPORT 1515 #define SUM 0 #define PRODUCT 1 int current_operation; void sig_handler(int signo) { printf("Signal %s received\n",(signo == SIGUSR2)?"SIGUSR2":"SIGUSR1"); if (signo==SIGUSR2) current_operation= SUM; else current_operation= PRODUCT; printf("Current operation is now %s\n",(current_operation==SUM)? "SUM":"PRODUCT"); } main(int argc,char *argv[]) { int sock,length, numerolinea, lunghezzalinea; struct sockaddr_in server,client; int msgsock,rval,i; int myport; struct sigaction sig; if(argc !=1) { fprintf(stderr,"Usage: %s\n",argv[0]); exit(-1); } printf("Server PID=%d\n",getpid()); myport = DEFAULTPORT; current_operation = SUM ; // inizialmente l'operazione svolta è la somma /* Un unico gestore per entrambi i segnali : la sigaction va chiamata due volte, una per ogni segnale */ sig.sa_handler = sig_handler; sigemptyset(&sig.sa_mask); sig.sa_flags=SA_RESTART; sigaction(SIGUSR1,&sig,NULL); sigaction(SIGUSR2,&sig,NULL); /* Crea la socket */ sock= socket(AF_INET,SOCK_STREAM,0); if(sock<0) { perror("open sulla socket dgram"); exit(1); } /* Name socket using wildcards */ server.sin_family = AF_INET; server.sin_addr.s_addr= INADDR_ANY; server.sin_port = htons(myport); if (bind(sock,(struct sockaddr *)&server,sizeof server)<0) { perror("bind sulla socket dgram"); 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 running on port #%d\n",ntohs(server.sin_port)); /* Pronto ad accettare connessioni */ listen(sock,2); do{ /* Attesa di una connessione */ msgsock= accept(sock,(struct sockaddr *)&client,(int *)&length); if(msgsock ==-1) perror("accept"); else { if(fork()==0) // Server è concorrente { // printf("Serving connection from %s, port %d\n", // inet_ntoa(client.sin_addr), // ntohs(client.sin_port)); close(sock); servizio(msgsock); close(msgsock); exit(0); } else close(msgsock); } } while(1); } servizio(int sock) { int rval, n1, n2, result ; char buf[256]; char answer[256]; memset(buf, 0, sizeof(buf)); if((rval=read(sock,buf, sizeof buf))<0) { perror("reading filename"); exit(-1); } sscanf(buf,"%d %d",&n1,&n2); if(current_operation == SUM) result = n1 + n2 ; else if(current_operation == PRODUCT) result = n1 * n2 ; sprintf(answer,"%d\n",result), printf("Received %d %d (current operation %s) = %d\n",n1,n2,(current_operation==SUM)? "SUM":"PRODUCT",result); if((rval = write(sock,answer,strlen(answer)+1))<0) perror("writing on stream socket"); printf("Service completed\n"); }