diff options
Diffstat (limited to 'server/server.c')
-rw-r--r-- | server/server.c | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/server/server.c b/server/server.c index 0a2bd0f..b2f1c3b 100644 --- a/server/server.c +++ b/server/server.c @@ -7,6 +7,7 @@ #include <fcntl.h> #include <syslog.h> #include <time.h> +#include <netinet/tcp.h> #include "server.h" #include "server_data_processing.h" @@ -34,6 +35,7 @@ static int accept_client(struct server *serv) struct session *new_session; socklen_t len = sizeof(addr); fd = accept(serv->listen_socket, (struct sockaddr*) &addr, &len); + setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (int[]){1}, sizeof(int)); if(fd == -1) return -1; @@ -395,6 +397,8 @@ static void determine_server_state(struct server *serv) case start_game: set_state_for_client(serv, attack); set_whose_turn(serv, attack); + update_game_info(serv->gi, serv->connected_players_counter, + serv->shuffled_deck_size, serv->position_whose_turn); set_record_status_for_all(serv); serv->state = attack_phase_out; break; @@ -418,6 +422,7 @@ static void determine_server_state(struct server *serv) break; case table: if(serv->turn_queue[1]->defense_lost) { + clear_defense_lost_status(serv->turn_queue[1]); move_all_cards_to_defender(&serv->cot, &serv->turn_queue[1]->deck); move_turn_queue_two_players_ahead(serv->turn_queue, serv->connected_players_counter); @@ -430,10 +435,18 @@ static void determine_server_state(struct server *serv) set_record_status_for_all(serv); set_state_for_client(serv, attack); set_whose_turn(serv, attack); + /* + * update the number of cards to determine how many cards + * a player still needs to add + */ update_card_quantity_arr(serv); deal_cards(serv->shuffled_deck, &serv->shuffled_deck_size, serv->turn_queue, serv->connected_players_counter, serv->cc.number_arr); + /* update the card count after giving out */ + update_card_quantity_arr(serv); + update_game_info(serv->gi, serv->connected_players_counter, + serv->shuffled_deck_size, serv->position_whose_turn); serv->state = attack_phase_out; break; case defense_phase_out: @@ -480,7 +493,7 @@ static int accept_new_player(struct server *serv) } static void set_up_player_tracking(struct server *serv, fd_set *readfds, - fd_set *writefds) + fd_set *writefds, int *maxfd) { int i; for(i = 0; i < serv->max_sess_arr_size; ++i) { @@ -489,11 +502,14 @@ static void set_up_player_tracking(struct server *serv, fd_set *readfds, switch(serv->state) { case first_player: - if(serv->sess_arr[i]->record) + if(serv->sess_arr[i]->record) { FD_SET(i, writefds); + *maxfd = i > *maxfd ? i : *maxfd; + } break; case confirmation_waiting: FD_SET(i, readfds); + *maxfd = i > *maxfd ? i : *maxfd; if(serv->sess_arr[i]->record) FD_SET(i, writefds); break; @@ -502,21 +518,30 @@ static void set_up_player_tracking(struct server *serv, fd_set *readfds, case table: case defense_phase_out: case tossing_phase_out: - if(serv->sess_arr[i]->record) + if(serv->sess_arr[i]->record) { FD_SET(i, writefds); + *maxfd = i > *maxfd ? i : *maxfd; + } break; case attack_phase_in: - if(serv->sess_arr[i]->state == attack) + if(serv->sess_arr[i]->state == attack) { FD_SET(i, readfds); + *maxfd = i > *maxfd ? i : *maxfd; + } break; case defense_phase_in: - if(serv->sess_arr[i]->state == defense) + if(serv->sess_arr[i]->state == defense) { FD_SET(i, readfds); + *maxfd = i > *maxfd ? i : *maxfd; + } break; case tossing_phase_in: if(serv->sess_arr[i]->state == tossing && serv->sess_arr[i]->tm == answer_wait) + { FD_SET(i, readfds); + *maxfd = i > *maxfd ? i : *maxfd; + } break; case no_players: {} @@ -646,7 +671,7 @@ int main_loop(struct server *serv) maxfd = serv->listen_socket; } - set_up_player_tracking(serv, &readfds, &writefds); + set_up_player_tracking(serv, &readfds, &writefds, &maxfd); select_result = select(maxfd + 1, &readfds, &writefds, NULL, NULL); if(select_result == -1) @@ -677,7 +702,6 @@ static int init_server(struct server *serv, int port) opt = 1; setsockopt(serv->listen_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); - addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(port); |