From 09f5684d3e6cec9d8534165ca8ff2ca6c7ceb01b Mon Sep 17 00:00:00 2001 From: Barry Kane Date: Wed, 12 Jul 2023 01:12:18 +0100 Subject: [PATCH] Update client to consider timestamp. --- src/client/cspt-client.c | 13 +++++++++++-- src/cspt-state.c | 1 - src/cspt-state.h | 3 ++- src/server/cspt-server.c | 3 +-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/client/cspt-client.c b/src/client/cspt-client.c index 2c8f88e..dd038bf 100644 --- a/src/client/cspt-client.c +++ b/src/client/cspt-client.c @@ -82,12 +82,21 @@ void * networkHandler(void * parameters) timeout.tv_sec = 0; timeout.tv_usec = 1000; setsockopt(udpSocket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); - + struct gameState * updatedState = calloc(1, sizeof(struct gameState)); while (true) { // Send our input, recieve the state: sendto(udpSocket, arguments->message, sizeof(struct clientInput), 0, (struct sockaddr *)&serverAddress, sizeof(struct sockaddr_in)); - recvfrom(udpSocket, arguments->state, sizeof(struct gameState), 0, NULL, NULL); + recvfrom(udpSocket, updatedState, sizeof(struct gameState), 0, NULL, NULL); + if(updatedState->timestamp.tv_sec > arguments->state->timestamp.tv_sec) + { + memcpy(arguments->state, updatedState, sizeof(struct gameState)); + } + else if(updatedState->timestamp.tv_sec == arguments->state->timestamp.tv_sec && + updatedState->timestamp.tv_usec > arguments->state->timestamp.tv_usec) + { + memcpy(arguments->state, updatedState, sizeof(struct gameState)); + } } } diff --git a/src/cspt-state.c b/src/cspt-state.c index b6795f7..3311b39 100644 --- a/src/cspt-state.c +++ b/src/cspt-state.c @@ -14,7 +14,6 @@ void updateInput(struct gameState * state, struct clientInput * message) void doGameTick(struct gameState * state) { - state->timestamp = time(NULL); for (int index = 0; index < 16; index++) { // Calculate acceleration: diff --git a/src/cspt-state.h b/src/cspt-state.h index fa237c5..39336de 100644 --- a/src/cspt-state.h +++ b/src/cspt-state.h @@ -2,6 +2,7 @@ #define CSPT_STATE_H #include #include +#include #include struct clientMovement { @@ -17,7 +18,7 @@ struct clientInput struct gameState { - time_t timestamp; + struct timeval timestamp; struct clientMovement clients[16]; }; diff --git a/src/server/cspt-server.c b/src/server/cspt-server.c index f970f39..adc45dd 100644 --- a/src/server/cspt-server.c +++ b/src/server/cspt-server.c @@ -41,7 +41,6 @@ void sigintHandler(int signal) void * networkThreadHandler(void * arguments) { struct ThreadParameters args = *(struct ThreadParameters *)arguments; - printf("%p\n", args.clientAddresses); struct sockaddr_in clientAddress, serverAddress; if ((*args.udpSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) @@ -82,6 +81,7 @@ void * gameThreadHandler(void * arguments) while (true) { doGameTick(args.state); + gettimeofday(&args.state->timestamp, NULL); for(int index = 0; index < 16; index++) { sendto(*(args.udpSocket), args.state, sizeof(struct gameState), 0, @@ -230,7 +230,6 @@ int main(int argc, char ** argv) // The client has sent a message, recieve it and process: if ((returnValue = recv(clientSockets[index], ¤tMessage, sizeof(struct CsptMessage), 0)) > 0) { - printf("%s, %u\n", messageStrings[currentMessage.type], currentMessage.content); switch (currentMessage.type) { // Hello: