back to scratko.xyz
aboutsummaryrefslogtreecommitdiff
path: root/server/server.c
diff options
context:
space:
mode:
authorscratko <m@scratko.xyz>2024-08-17 02:42:19 +0300
committerscratko <m@scratko.xyz>2024-08-17 02:42:19 +0300
commit4b2fdc91d42a438193d15840e10851c3847fbe80 (patch)
tree08c3de6e851ee07463beae6d0a2fbd9e74202662 /server/server.c
parenteb90648bdad1443c9cfc72e903a93642e10a0ab7 (diff)
downloaddurak-4b2fdc91d42a438193d15840e10851c3847fbe80.tar.gz
durak-4b2fdc91d42a438193d15840e10851c3847fbe80.tar.bz2
durak-4b2fdc91d42a438193d15840e10851c3847fbe80.zip
Global fixes v3.0
Fixed bug when entering cards incorrectly. Added recognition of disconnection from the server. Added welcome screen and update screen.
Diffstat (limited to 'server/server.c')
-rw-r--r--server/server.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/server/server.c b/server/server.c
index 1655448..f842a70 100644
--- a/server/server.c
+++ b/server/server.c
@@ -56,6 +56,18 @@ static int accept_client(struct server *serv)
static void close_connection(struct server *serv)
{
+ int i;
+
+ for(i = 0; i < serv->max_sess_arr_size; ++i) {
+ if(!serv->sess_arr[i])
+ continue;
+ serv->sess_arr[i]->state = disconnect;
+ send_disconnect_status(serv->sess_arr[i]->fd);
+ close(serv->sess_arr[i]->fd);
+ free(serv->sess_arr[i]);
+ serv->sess_arr[i] = NULL;
+ }
+ serv->connected_players_counter = 0;
}
static int check_playable_player_number(struct server *serv)
@@ -76,6 +88,7 @@ static void init_new_game(struct server *serv)
who_attack = -1;
lowest_trump = 0;
+ serv->shuffled_deck_size = max_shuffled_deck_size;
serv->shuffled_deck = get_shuffled_deck();
serv->trump_card =
extract_trump_card(serv->shuffled_deck, &serv->shuffled_deck_size);
@@ -609,11 +622,6 @@ static void set_up_player_tracking(struct server *serv, fd_set *readfds,
switch(serv->state) {
case first_player:
- 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;
@@ -695,6 +703,9 @@ static void make_data_transfer(struct server *serv, fd_set *readfds,
result = print_message_for_first_player(i);
serv->sess_arr[i]->record = 0;
}
+ /* connection was closed? (result == 0) */
+ if(FD_ISSET(i, readfds))
+ result = read(i, serv->sess_arr[i]->buffer, max_buffer_size);
break;
case confirmation_waiting:
if(FD_ISSET(i, writefds) && serv->sess_arr[i]->record) {
@@ -755,13 +766,17 @@ static void make_data_transfer(struct server *serv, fd_set *readfds,
break;
}
}
- if(serv->state == start_game || serv->state == table)
+ if(serv->state == start_game || serv->state == table ||
+ serv->state == end_game)
sleep(2);
if(check_server_state_change_conditions(serv))
serv->change_server_state = 1;
/* connection is closed */
- if(!result)
+ if(!result) {
close_connection(serv);
+ serv->change_server_state = 0;
+ serv->state = no_players;
+ }
}
int main_loop(struct server *serv)