2 * Server concurrente usando protocolo TCP para manipular un set.
11 int main (int argc, char *argv[])
13 static char el_socket[15]; /* string que contiene el socket para el servidor de eco */
15 int sockfd; /* socket que sirve como template */
16 int newsockfd; /* socket conectado al cliente */
18 unsigned int clilen; /* longitud dir. cliente */
19 unsigned int childpid; /* pid del hijo */
20 struct sockaddr_in cli_addr;
22 /* Verifico parametros de linea de comandos */
26 port = LIBTCP_DEFAULT_TCP_PORT;
29 /* Inicia Servidor - Open Pasivo */
30 if ((sockfd = libtcp_open_pasivo(port)) < 0)
32 perror("Server: no se puede abrir el stream socket");
36 print_msg(stdout, "server: se hizo el open pasivo, socket %d\n", sockfd);
38 signal(SIGCHLD, fin_hijos);
40 /* PROCESAMIENTO DEL SERVER */
43 clilen = sizeof(cli_addr);
44 newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
47 perror("server: error en el accept");
51 if ((childpid = fork()) < 0)
53 perror("server: error en el fork");
56 else if (childpid == 0)
58 /* PROCESO HIJO (child) que atiende al cliente */
59 close(sockfd); /* cerramos socket original */
61 print_msg(stdout, "server: socket armado con un cliente %d\n", newsockfd);
63 /* pasarle el socket al hijo que atiende */
64 sprintf(el_socket, "%d\n", newsockfd);
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.");
72 /* PROCESO PADRE, se prepara para recibir otro cliente */
73 /* cerrar el socket pasado al hijo */
78 /** Elimina Procesos-hijos que terminaron */
82 while (wait3((int *)&status, WNOHANG, (struct rusage *)0) >= 0);
85 // vim: set et sw=4 sts=4 :