diff options
Diffstat (limited to 'client/client.c')
-rw-r--r-- | client/client.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/client/client.c b/client/client.c index d932a51..4abcf7d 100644 --- a/client/client.c +++ b/client/client.c @@ -4,6 +4,7 @@ #include <unistd.h> #include <stdlib.h> #include <string.h> +#include <stdio.h> /* test */ #include "client.h" #include "data_decryption.h" @@ -15,15 +16,23 @@ static const int port = 8082; static void get_data_from_server(struct client *cl, fd_set *readfds) { + int i; int update_info = 0; /* pointer to delimeter (:) that is behind extract data */ char *end_p; if(FD_ISSET(cl->fd, readfds)) { - read(cl->fd, cl->buffer, max_buffer_size); + if(!cl->data_left_in_buffer) { + cl->data_left_in_buffer = read(cl->fd, cl->buffer, max_buffer_size); + printf("%d\n", cl->data_left_in_buffer); + for(i = 0; i < cl->data_left_in_buffer; ++i) + putchar(cl->buffer[i]); + putchar('\n'); + } decrypt_set_state(cl, &end_p); update_info = 1; cl->display_new_frame = 1; + cl->pending_server_response = 0; } if(update_info) { switch(cl->state) { @@ -50,13 +59,20 @@ static void get_data_from_server(struct client *cl, fd_set *readfds) decrypt_set_card_queue(cl, end_p+1); break; case card_acceptance_status: - decrypt_set_card_acceptance_status(cl, cl->buffer); + decrypt_set_card_acceptance_status(cl, end_p+1); break; /* no data to extract */ case tossing_limit_status: default: {} } + for(i = 0; cl->buffer[i] != '\n'; ++i) + {} + if((cl->buffer+i - cl->buffer + 1) != cl->data_left_in_buffer) { + cl->data_left_in_buffer -= i + 1; + memmove(cl->buffer, cl->buffer+i+1, cl->data_left_in_buffer); + } else + cl->data_left_in_buffer = 0; } } @@ -66,7 +82,7 @@ static void prepare_tips_for_client(struct client *cl) if(!is_empty_stack(cl->deck)) add_hint_letters_stack(cl->deck); - +/* TODO: clear marked cards ??? */ switch(cl->state) { case attack: mark_card_for_attackers_stack(cl->deck); @@ -126,7 +142,7 @@ static void change_client_frame(struct client *cl) static void send_data_to_server(struct client *cl, fd_set *readfds) { - int input_result; + int input_result = 0; if(FD_ISSET(0, readfds)) { /* 0 - stdin */ read(0, cl->buffer, max_buffer_size); @@ -181,9 +197,11 @@ int main_loop(struct client *cl) if(check_tracking_client_input(cl->state, cl->pending_server_response)) FD_SET(0, &readfds); - select_result = select(cl->fd + 1, &readfds, NULL, NULL, NULL); - if(select_result == -1) - return 2; + if(!cl->data_left_in_buffer) { + select_result = select(cl->fd + 1, &readfds, NULL, NULL, NULL); + if(select_result == -1) + return 2; + } get_data_from_server(cl, &readfds); prepare_tips_for_client(cl); if(cl->display_new_frame) @@ -210,6 +228,7 @@ static void init_client(struct client *cl) cl->position_whose_turn = 0; cl->display_new_frame = 0; cl->all_input_cards_accepted = 0; + cl->data_left_in_buffer = 0; } /* @@ -222,6 +241,7 @@ static int connect_to_server(struct client *cl) struct sockaddr_in addr; cl->fd = socket(AF_INET, SOCK_STREAM, 0); + if(cl->fd == -1) return 0; addr.sin_family = AF_INET; |