diff --git a/src/client/cspt-client.c b/src/client/cspt-client.c index b244b2f..aabe3b7 100644 --- a/src/client/cspt-client.c +++ b/src/client/cspt-client.c @@ -60,6 +60,15 @@ void * graphicsThreadHandler(void * parameters) { struct gameState * state = (struct gameState *)parameters; uint32_t rendererFlags = SDL_RENDERER_ACCELERATED; + int udpSocket = 0; + struct sockaddr_in recieveAddress; + + // Set our IP address and port. Default to localhost for testing: + recieveAddress.sin_family = AF_INET; + recieveAddress.sin_addr.s_addr = INADDR_ANY; + recieveAddress.sin_port = htons(5200); + + udpSocket = socket(AF_INET, SOCK_DGRAM, 0); // Create an SDL window and rendering context in that window: SDL_Window * window = SDL_CreateWindow("CSPT-Client", SDL_WINDOWPOS_CENTERED, @@ -70,10 +79,13 @@ void * graphicsThreadHandler(void * parameters) SDL_SetWindowResizable(window, SDL_TRUE); state->clients[0].xPosition = 300; state->clients[0].yPosition = 300; - -// while (parameters->keepRunning) + + bind(udpSocket, (struct sockaddr *)&recieveAddress, sizeof(struct sockaddr)); + while (true) { + recvfrom(udpSocket, state, sizeof(struct gameState), 0, NULL, NULL); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Clear the screen, filling it with black: SDL_RenderClear(renderer); diff --git a/src/cspt-state.c b/src/cspt-state.c index 9c4e63a..c184641 100644 --- a/src/cspt-state.c +++ b/src/cspt-state.c @@ -1,4 +1,21 @@ #include "cspt-state.h" +void updateInput(struct gameState * state, struct clientInput * message, struct sockaddr_in * address, int * clientSockets) +{ + int index = 0; + struct sockaddr_in currentClientAddress; + for (index = 0; index < 16; index++) + { + getsockname(clientSockets[index], (struct sockaddr *)¤tClientAddress, (socklen_t *)sizeof(struct sockaddr_in)); + if (currentClientAddress.sin_addr.s_addr == address->sin_addr.s_addr) + { + state->clients[index].leftAcceleration = message->left; + state->clients[index].rightAcceleration = message->right; + state->clients[index].upAcceleration = message->up; + state->clients[index].downAcceleration = message->down; + break; + } + } +} void doGameTick(struct gameState * state) { diff --git a/src/cspt-state.h b/src/cspt-state.h index 5a5cbe4..0698e91 100644 --- a/src/cspt-state.h +++ b/src/cspt-state.h @@ -2,7 +2,7 @@ #define CSPT_STATE_H #include #include - +#include struct clientMovement { double xPosition, yPosition, xVelocity, yVelocity; @@ -20,6 +20,14 @@ struct gameState struct clientMovement clients[16]; }; +struct networkThreadArguments +{ + int * clientSockets; + struct gameState * state; +}; + +void updateInput(struct gameState * state, struct clientInput * message, struct sockaddr_in * address, int * clientSockets); + void doGameTick(struct gameState * state); #endif diff --git a/src/server/cspt-server.c b/src/server/cspt-server.c index bd16f66..ed04a7d 100644 --- a/src/server/cspt-server.c +++ b/src/server/cspt-server.c @@ -10,10 +10,12 @@ #include #include #include +#include #include #include #include #include +#include "../cspt-state.h" #include "../cspt-message.h" bool keepRunning = true; const int PORT = 5200; @@ -29,8 +31,13 @@ void sigintHandler(int signal) void * networkThreadHandler(void * arguments) { + struct networkThreadArguments * args = (struct networkThreadArguments *)arguments; int udpSocket; - struct sockaddr_in serverAddress; + pthread_t networkThread; + struct clientInput message; + socklen_t clientAddressLength; + struct sockaddr_in clientAddress, serverAddress; + if ((udpSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { exit(EXIT_FAILURE); @@ -40,6 +47,25 @@ void * networkThreadHandler(void * arguments) serverAddress.sin_family = AF_INET; serverAddress.sin_port = htons(PORT); serverAddress.sin_addr.s_addr = INADDR_ANY; + +// bind(udpSocket, (struct sockaddr *)&serverAddress, sizeof(struct sockaddr_in)); + + printf("Started network thread.\n"); + + while (true) + { +// bzero(&message, sizeof(struct clientInput)); +// recvfrom(udpSocket, &message, sizeof(struct clientInput), 0, (struct sockaddr *)&clientAddress, &clientAddressLength); +// updateInput(args->state, &message, &clientAddress, args->clientSockets); + for (int index = 0; index < 16; index++) + { + if(args->clientSockets[index] > 0) + { +// getsockname(args->clientSockets[index], (struct sockaddr *)&clientAddress, (socklen_t *)sizeof(struct sockaddr_in)); + sendto(udpSocket, args->state, sizeof(struct gameState), 0, (struct sockaddr *)&serverAddress, (socklen_t)sizeof(struct sockaddr_in)); + } + } + } return NULL; } @@ -50,14 +76,23 @@ int main(int argc, char ** argv) int masterSocket = 0; int clientSockets[16]; fd_set connectedClients; - struct connectionStatus clientStatus[16]; - struct sockaddr_in serverAddress, clientAddress; + pthread_t networkThread; + struct gameState currentState; struct CsptMessage currentMessage; + struct connectionStatus clientStatus[16]; + struct networkThreadArguments networkArguments; + struct sockaddr_in serverAddress, clientAddress; + printf("Client-Side Prediction Test - Server Starting.\n"); // Setup the sigint handler: signal(SIGINT, sigintHandler); + networkArguments.clientSockets = clientSockets; + networkArguments.state = ¤tState; + + pthread_create(&networkThread, NULL, networkThreadHandler, (void *)&networkArguments); + // Setup TCP Master Socket: printf("Setting up master socket... "); masterSocket = socket(AF_INET, SOCK_STREAM, 0); @@ -179,13 +214,15 @@ int main(int argc, char ** argv) case 0: { currentMessage.type = 0; - currentMessage.content = (uint8_t)random() % 16; + currentState.clients[index].registered = true; + currentMessage.content = (uint8_t)index; send(clientSockets[index], ¤tMessage, sizeof(struct CsptMessage), 0); break; } // Goodbye: case 1: { + currentState.clients[index].registered = false; FD_CLR(clientSockets[index], &connectedClients); shutdown(clientSockets[index], SHUT_RDWR); clientSockets[index] = 0; @@ -238,7 +275,6 @@ int main(int argc, char ** argv) } } } - printf("Waiting on pongs.\n"); } } }