]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/practica3/parte1/server.cpp
Primera parte de práctica 3 terminada.
[z.facultad/75.74/practicos.git] / practicas / practica3 / parte1 / server.cpp
1 /*
2  * Server concurrente usando protocolo TCP para manipular un set.
3  */
4
5 #include "libtcp.h"
6 #include "common.h"
7 #include <csignal>
8
9 void fin_hijos(int);
10
11 int main (int argc, char *argv[])
12 {
13     static char el_socket[15]; /* string que contiene el socket para el servidor de eco */
14
15     int sockfd;    /* socket que sirve como template */ 
16     int newsockfd; /* socket conectado al cliente */
17     int port;
18     unsigned int clilen; /* longitud dir. cliente */
19     unsigned int childpid; /* pid del hijo */
20     struct sockaddr_in cli_addr;
21
22     /* Verifico parametros de linea de comandos */
23     if (argc > 1)
24         port = atoi(argv[1]);
25     else
26         port = LIBTCP_DEFAULT_TCP_PORT;
27
28
29     /* Inicia Servidor - Open Pasivo */
30     if ((sockfd = libtcp_open_pasivo(port)) < 0)
31     {
32         perror("Server: no se puede abrir el stream socket");
33         exit(1);
34     }
35
36     print_msg(stdout, "server: se hizo el open pasivo, socket %d\n", sockfd);
37
38     signal(SIGCHLD, fin_hijos);
39
40     /* PROCESAMIENTO DEL SERVER */
41     while (1)
42     {
43         clilen = sizeof(cli_addr);
44         newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
45         if (newsockfd < 0)
46         {
47             perror("server: error en el accept");
48             exit(1); 
49         }
50
51         if ((childpid = fork()) < 0)
52         { 
53             perror("server: error en el fork");
54             exit(1);
55         }
56         else if (childpid == 0)
57         {
58             /* PROCESO HIJO (child) que atiende al cliente */
59             close(sockfd); /* cerramos socket original */
60
61             print_msg(stdout, "server: socket armado con un cliente  %d\n", newsockfd);
62
63             /* pasarle el socket al hijo que atiende */
64             sprintf(el_socket, "%d\n", newsockfd);
65
66             /* Se lanza el proceso que atiende a ese cliente */
67             execlp("./serverhandler", "./serverhandler", el_socket, (char *)0);
68             perror("Server: error al lanzar el handler del servidor.");
69             exit(3);
70         }
71
72         /* PROCESO PADRE, se prepara para recibir otro cliente */
73         /* cerrar el socket pasado al hijo */
74         close(newsockfd);
75     }
76 }
77
78 /** Elimina Procesos-hijos que terminaron */
79 void fin_hijos(int) 
80 {
81     union wait status;
82     while (wait3((int *)&status, WNOHANG, (struct rusage *)0) >= 0);
83 }
84
85 // vim: set et sw=4 sts=4 :