Make the server not just spam packets
This commit is contained in:
parent
dcccf78b04
commit
b87f2d06ba
|
@ -49,6 +49,13 @@ I didn't make the client update it's own input in the state constantly, so there
|
||||||
wasn't the required "single-player" feeling in the client. Not exactly what
|
wasn't the required "single-player" feeling in the client. Not exactly what
|
||||||
we're going for, here!
|
we're going for, here!
|
||||||
|
|
||||||
|
** Entry 05: How client side prediction performs:
|
||||||
|
After running a basic test on my LAN, it appears as if my naive implementation
|
||||||
|
isn't performing as expected. It's possible that just spamming the client with
|
||||||
|
packets that aren't tied to the game tick is causing it; I'm going to change
|
||||||
|
that. It probably should have been done that way from the start; but I didn't
|
||||||
|
really think about that.
|
||||||
|
|
||||||
* Notes On Techniques:
|
* Notes On Techniques:
|
||||||
** Entry 00: Where I'm Learning All This From:
|
** Entry 00: Where I'm Learning All This From:
|
||||||
I'm using a series of articles from gabrielgambetta.com, which seem to be well
|
I'm using a series of articles from gabrielgambetta.com, which seem to be well
|
||||||
|
|
|
@ -71,7 +71,7 @@ void * networkHandler(void * parameters)
|
||||||
|
|
||||||
// Point at the server:
|
// Point at the server:
|
||||||
serverAddress.sin_family = AF_INET;
|
serverAddress.sin_family = AF_INET;
|
||||||
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
|
serverAddress.sin_addr.s_addr = inet_addr("192.168.0.100");
|
||||||
serverAddress.sin_port = htons(5200);
|
serverAddress.sin_port = htons(5200);
|
||||||
|
|
||||||
// Create a UDP socket to send through:
|
// Create a UDP socket to send through:
|
||||||
|
@ -231,7 +231,7 @@ int main(int argc, char ** argv)
|
||||||
|
|
||||||
// Set our IP address and port. Default to localhost for testing:
|
// Set our IP address and port. Default to localhost for testing:
|
||||||
serverAddress.sin_family = AF_INET;
|
serverAddress.sin_family = AF_INET;
|
||||||
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
|
serverAddress.sin_addr.s_addr = inet_addr("192.168.0.100");
|
||||||
serverAddress.sin_port = htons(5200);
|
serverAddress.sin_port = htons(5200);
|
||||||
|
|
||||||
// Connect to the server:
|
// Connect to the server:
|
||||||
|
|
|
@ -24,6 +24,15 @@ struct connectionStatus
|
||||||
uint8_t remainingPongs;
|
uint8_t remainingPongs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// A structure containing the "current" global state:
|
||||||
|
struct ThreadParameters
|
||||||
|
{
|
||||||
|
struct sockaddr_in * clientAddresses;
|
||||||
|
struct clientInput * message;
|
||||||
|
struct gameState * state;
|
||||||
|
int * udpSocket;
|
||||||
|
};
|
||||||
|
|
||||||
void sigintHandler(int signal)
|
void sigintHandler(int signal)
|
||||||
{
|
{
|
||||||
keepRunning = false;
|
keepRunning = false;
|
||||||
|
@ -31,13 +40,11 @@ void sigintHandler(int signal)
|
||||||
|
|
||||||
void * networkThreadHandler(void * arguments)
|
void * networkThreadHandler(void * arguments)
|
||||||
{
|
{
|
||||||
int udpSocket;
|
struct ThreadParameters args = *(struct ThreadParameters *)arguments;
|
||||||
pthread_t networkThread;
|
printf("%p\n", args.clientAddresses);
|
||||||
struct clientInput message;
|
|
||||||
socklen_t clientAddressLength;
|
|
||||||
struct sockaddr_in clientAddress, serverAddress;
|
struct sockaddr_in clientAddress, serverAddress;
|
||||||
|
|
||||||
if ((udpSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
|
if ((*args.udpSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
|
||||||
{
|
{
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -47,32 +54,39 @@ void * networkThreadHandler(void * arguments)
|
||||||
serverAddress.sin_port = htons(5200);
|
serverAddress.sin_port = htons(5200);
|
||||||
serverAddress.sin_addr.s_addr = INADDR_ANY;
|
serverAddress.sin_addr.s_addr = INADDR_ANY;
|
||||||
|
|
||||||
bind(udpSocket, (struct sockaddr *)&serverAddress, sizeof(struct sockaddr_in));
|
bind(*args.udpSocket, (struct sockaddr *)&serverAddress, sizeof(struct sockaddr_in));
|
||||||
|
|
||||||
printf("Started network thread.\n");
|
printf("Started network thread.\n");
|
||||||
socklen_t test = sizeof(clientAddress);
|
socklen_t test = sizeof(clientAddress);
|
||||||
int returnvalue = 0;
|
int returnvalue = 0;
|
||||||
bzero(arguments, sizeof(struct gameState));
|
bzero(args.state, sizeof(struct gameState));
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
recvfrom(udpSocket, &message, sizeof(struct clientInput), 0, (struct sockaddr *)&clientAddress, &test);
|
returnvalue = recvfrom(*(args.udpSocket), args.message, sizeof(struct clientInput), 0, (struct sockaddr *)&clientAddress, &test);
|
||||||
returnvalue = sendto(udpSocket, arguments, sizeof(struct gameState), 0,
|
memcpy(&(args.clientAddresses[args.message->clientNumber]), &clientAddress, sizeof(struct sockaddr_in));
|
||||||
(struct sockaddr *)&clientAddress, (socklen_t)sizeof(struct sockaddr_in));
|
|
||||||
if(returnvalue > 0)
|
if(returnvalue > 0)
|
||||||
{
|
{
|
||||||
updateInput(arguments, &message);
|
updateInput(args.state, args.message);
|
||||||
}
|
}
|
||||||
bzero(&message, sizeof(struct clientInput));
|
bzero(args.message, sizeof(struct clientInput));
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void * gameThreadHandler(void * arguments)
|
void * gameThreadHandler(void * arguments)
|
||||||
{
|
{
|
||||||
|
struct ThreadParameters args = *(struct ThreadParameters *)arguments;
|
||||||
|
sleep(1);
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
doGameTick(arguments);
|
doGameTick(args.state);
|
||||||
|
for(int index = 0; index < 16; index++)
|
||||||
|
{
|
||||||
|
sendto(*(args.udpSocket), args.state, sizeof(struct gameState), 0,
|
||||||
|
(struct sockaddr *)&(args.clientAddresses[index]), (socklen_t)sizeof(struct sockaddr_in));
|
||||||
|
}
|
||||||
usleep(15625);
|
usleep(15625);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,20 +96,25 @@ int main(int argc, char ** argv)
|
||||||
int masterSocket = 0;
|
int masterSocket = 0;
|
||||||
int clientSockets[16];
|
int clientSockets[16];
|
||||||
fd_set connectedClients;
|
fd_set connectedClients;
|
||||||
pthread_t networkThread, gameThread;
|
struct sockaddr_in serverAddress;
|
||||||
struct gameState currentState;
|
|
||||||
struct CsptMessage currentMessage;
|
struct CsptMessage currentMessage;
|
||||||
|
pthread_t networkThread, gameThread;
|
||||||
struct connectionStatus clientStatus[16];
|
struct connectionStatus clientStatus[16];
|
||||||
struct networkThreadArguments networkArguments;
|
|
||||||
struct sockaddr_in serverAddress, clientAddress;
|
struct ThreadParameters * globalState = calloc(1, sizeof(struct ThreadParameters));
|
||||||
|
|
||||||
|
globalState->clientAddresses = calloc(16, sizeof(struct sockaddr_in));
|
||||||
|
globalState->message = calloc(1, sizeof(struct clientInput));
|
||||||
|
globalState->state = calloc(1, sizeof(struct gameState));
|
||||||
|
globalState->udpSocket = calloc(1, sizeof(int));
|
||||||
|
|
||||||
printf("Client-Side Prediction Test - Server Starting.\n");
|
printf("Client-Side Prediction Test - Server Starting.\n");
|
||||||
|
|
||||||
// Setup the sigint handler:
|
// Setup the sigint handler:
|
||||||
signal(SIGINT, sigintHandler);
|
signal(SIGINT, sigintHandler);
|
||||||
|
pthread_create(&networkThread, NULL, networkThreadHandler, globalState);
|
||||||
|
pthread_create(&gameThread, NULL, gameThreadHandler, globalState);
|
||||||
|
|
||||||
pthread_create(&networkThread, NULL, networkThreadHandler, ¤tState);
|
|
||||||
pthread_create(&gameThread, NULL, gameThreadHandler, ¤tState);
|
|
||||||
|
|
||||||
// Setup TCP Master Socket:
|
// Setup TCP Master Socket:
|
||||||
printf("Setting up master socket... ");
|
printf("Setting up master socket... ");
|
||||||
|
@ -218,11 +237,11 @@ int main(int argc, char ** argv)
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
currentMessage.type = 0;
|
currentMessage.type = 0;
|
||||||
currentState.clients[index].registered = true;
|
globalState->state->clients[index].registered = true;
|
||||||
currentState.clients[index].xPosition = 300;
|
globalState->state->clients[index].xPosition = 300;
|
||||||
currentState.clients[index].yPosition = 300;
|
globalState->state->clients[index].yPosition = 300;
|
||||||
currentState.clients[index].xVelocity = 0;
|
globalState->state->clients[index].xVelocity = 0;
|
||||||
currentState.clients[index].yVelocity = 0;
|
globalState->state->clients[index].yVelocity = 0;
|
||||||
currentMessage.content = (uint8_t)index;
|
currentMessage.content = (uint8_t)index;
|
||||||
send(clientSockets[index], ¤tMessage, sizeof(struct CsptMessage), 0);
|
send(clientSockets[index], ¤tMessage, sizeof(struct CsptMessage), 0);
|
||||||
break;
|
break;
|
||||||
|
@ -230,7 +249,7 @@ int main(int argc, char ** argv)
|
||||||
// Goodbye:
|
// Goodbye:
|
||||||
case 1:
|
case 1:
|
||||||
{
|
{
|
||||||
currentState.clients[index].registered = false;
|
globalState->state->clients[index].registered = false;
|
||||||
FD_CLR(clientSockets[index], &connectedClients);
|
FD_CLR(clientSockets[index], &connectedClients);
|
||||||
shutdown(clientSockets[index], SHUT_RDWR);
|
shutdown(clientSockets[index], SHUT_RDWR);
|
||||||
clientSockets[index] = 0;
|
clientSockets[index] = 0;
|
||||||
|
|
Loading…
Reference in New Issue