back to scratko.xyz
aboutsummaryrefslogtreecommitdiff
path: root/server/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/server.c')
-rw-r--r--server/server.c38
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);