void dispatcher_core(void *inisock) { int sockval; signal(&dispatcher_sigusr1, SIGUSR1); openlog ("IRCDISPATCHER", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL3); if (!daemon_on && initiate_dispatcher(*inisock) == ERR) { syslog(LOG_ERR, "Error intiating dispatcher."); pthread_exit(ERR); } while (has_next(_connections)) { if (extract_connection(_connections, &sockval) == ERR) { syslog(LOG_ERR, "Error extrayendo conexión"); return; } syslog(LOG_INFO, "Escuchando conexión %d", sockval); listen_connection(sockval); } stop_dispatcher(); }
void * server_loop(void * arg) { int listener_fd; int fdmax; fd_set master; // master file descriptor list fd_set read_fds; // tmp file descriptor list for select int i, j; pthread_t connector, receiver; FD_ZERO(&master); // clear the master and temp sets FD_ZERO(&read_fds); // create socket and listen on it listener_fd = listen_connection(PORT_1); FD_SET(listener_fd, &master); fdmax = listener_fd; while(1) { read_fds = master; // copy it if (select(fdmax + 1, &read_fds, NULL, NULL, NULL) == -1 ) { perror("select() fails"); exit(4); } // run through the existing connections looking for data to read for (i = 0; i <= fdmax; i++) { if (FD_ISSET(i, &read_fds)) { if (i == listener_fd) { // getting new incoming connection accept_connection(listener_fd, &fdmax, &master); } else { char* buffer = malloc(sizeof(Message_t)); memset (buffer, 0, sizeof(Message_t)); // handling data from client int bytesRead = datalink_recv(i, buffer); Message_t* msg = (Message_t*)buffer; // read the application header switch (msg->type) { case REMOTE_SHUTDOWN_MSG: close(i); FD_CLR(i, &master); break; case CHAT_MSG: printf("%s\n", msg->data); // print chat text break; case TRANSFER_MSG: store(msg, bytesRead); break; } } } } } return NULL; }