void app(t_listc *listc, t_listh *listh, t_listm *listm, int sock) { int csock; int max; fd_set rdfs; fd_set wdfs; max = sock; while (1) { init_rdfs(listc, &rdfs, sock); init_wdfs(listm, &wdfs); /*show_listm(listm);*/ if (select(max + 1, &rdfs, &wdfs, NULL, NULL) < 0) { perror("select()"); return ; } if(FD_ISSET(STDIN_FILENO, &rdfs)) return; else if(FD_ISSET(sock, &rdfs)) { if ((csock = add_new_client(listc, sock, &rdfs)) > max) max = csock; } else { select_read(listc, listh, listm, &rdfs); select_write(listm, &wdfs); } } }
void check_connect_client(t_server *server) { int fd_socket_client; struct sockaddr_in sin_client; socklen_t size_sin_client; if (FD_ISSET(server->fd_socket, &server->readfd)) { memset(&(sin_client), 0, sizeof(sin_client)); size_sin_client = 0; if ((fd_socket_client = accept(server->fd_socket, (struct sockaddr *)&(sin_client), &size_sin_client)) == -1) { perror("accept"); return ; } add_new_client(server, fd_socket_client, 0); if (fd_socket_client > server->fd_socket) server->fd_max = fd_socket_client; printf("[\033[32m+\033[0m]Connection client [%d]\n", fd_socket_client); } }
/** * Main function of the server application. It does a infinite loop unless a user exits the program. * @param[in] listener_socket File descriptor of the socket listening incoming connections. * @param[in] fifo File descriptor of a temporary FIFO file. */ void doServer(int listener_socket, int fifo) { int i, fdmax, newfd; players_list_s *players_list = NULL; games_list_s *games_list = NULL; threads_list_s *threads_list = NULL; pthread_mutex_t players_list_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t games_list_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t threads_list_mutex = PTHREAD_MUTEX_INITIALIZER; fd_set base_rdfs, rdfs; sigset_t mask, oldmask; FD_ZERO(&base_rdfs); FD_SET(listener_socket, &base_rdfs); fdmax = max(listener_socket, fifo); sigemptyset(&mask); sigaddset(&mask, SIGINT); sigprocmask(SIG_BLOCK, &mask, &oldmask); initialize_structures(&players_list, &games_list, &threads_list); printf("Four-in-a-line server started\n"); while (work) { rdfs = base_rdfs; if (pselect(fdmax + 1, &rdfs, NULL, NULL, NULL, &oldmask) > 0) { for (i = 0; i <= fdmax; i++) { newfd = -1; if (FD_ISSET(i, &rdfs)) { if (i == listener_socket) { /* request from newly connected client */ newfd = add_new_client(listener_socket); if (newfd > 0) { FD_SET(newfd, &base_rdfs); if (newfd > fdmax) { fdmax = newfd; } display_log(newfd); communicate(newfd, &base_rdfs, &players_list, &games_list, &threads_list, &players_list_mutex, &games_list_mutex, &threads_list_mutex); } else if (i == fifo) { /* trick to update base_rdfs set */ char temp[1]; bulk_read(fifo, temp, 1); } } else { /* request from already connected client */ communicate(i, &base_rdfs, &players_list, &games_list, &threads_list, &players_list_mutex, &games_list_mutex, &threads_list_mutex); } } } } else { if (EINTR == errno) continue; ERR("pselect"); } } pthread_mutex_destroy(&players_list_mutex); pthread_mutex_destroy(&games_list_mutex); pthread_mutex_destroy(&threads_list_mutex); destroy_players(players_list); destroy_games(games_list); destroy_threads(threads_list); sigprocmask(SIG_UNBLOCK, &mask, NULL); }
static char read_event(client_data_t *data) { if (NEW_CLIENT_CONNECTION) add_new_client(); }