Make the timeouts configurable with net scores.

This commit is contained in:
Jeremy Rand 2023-06-11 23:33:47 -04:00
parent 6afbf4eb85
commit 59dc11e516
3 changed files with 50 additions and 13 deletions

View File

@ -27,6 +27,10 @@
/* Defines and macros */
#define GLOBAL_SCORE_REFRESH_TIME (15 * 60 * 60)
#define SHUTDOWN_NETWORK_TIMEOUT (2 * 60)
#define TCP_CONNECT_TIMEOUT (8 * 60)
#define READ_NETWORK_TIMEOUT (5 * 60)
#define NETWORK_RETRY_TIMEOUT (3 * 60 * 60)
#define TOOLFAIL(string) \
if (toolerror()) SysFailMgr(toolerror(), (Pointer)"\p" string "\n\r Error Code -> $");
@ -241,6 +245,10 @@ int main(void)
highScoreInitParams.scorePort = NETWORK_SERVERPORT;
highScoreInitParams.secret1 = NETWORK_SERVERSECRET1;
highScoreInitParams.secret2 = NETWORK_SERVERSECRET2;
highScoreInitParams.shutdownTimeout = SHUTDOWN_NETWORK_TIMEOUT;
highScoreInitParams.connectTimeout = TCP_CONNECT_TIMEOUT;
highScoreInitParams.readTimeout = READ_NETWORK_TIMEOUT;
highScoreInitParams.retryTimeout = NETWORK_RETRY_TIMEOUT;
highScoreInitParams.displayConnectionString = showConnectionString;
highScoreInitParams.waitForVbl = waitForVbl;

View File

@ -29,10 +29,10 @@
#define RESPONSE_TYPE_SCORES 1
#define RESPONSE_TYPE_STATUS 2
#define SHUTDOWN_NETWORK_TIMEOUT (2 * 60)
#define TCP_CONNECT_TIMEOUT (8 * 60)
#define READ_NETWORK_TIMEOUT (5 * 60)
#define NETWORK_RETRY_TIMEOUT (3 * 60 * 60)
#define DEFAULT_SHUTDOWN_NETWORK_TIMEOUT (2 * 60)
#define DEFAULT_TCP_CONNECT_TIMEOUT (8 * 60)
#define DEFAULT_READ_NETWORK_TIMEOUT (5 * 60)
#define DEFAULT_NETWORK_RETRY_TIMEOUT (3 * 60 * 60)
// Types
@ -252,6 +252,15 @@ void NSGS_InitNetwork(tNSGSHighScoreInitParams * params)
memcpy(&(networkGlobals->initParams), params, sizeof(networkGlobals->initParams));
if (networkGlobals->initParams.shutdownTimeout == 0)
networkGlobals->initParams.shutdownTimeout = DEFAULT_SHUTDOWN_NETWORK_TIMEOUT;
if (networkGlobals->initParams.connectTimeout == 0)
networkGlobals->initParams.connectTimeout = DEFAULT_TCP_CONNECT_TIMEOUT;
if (networkGlobals->initParams.readTimeout == 0)
networkGlobals->initParams.readTimeout = DEFAULT_READ_NETWORK_TIMEOUT;
if (networkGlobals->initParams.retryTimeout == 0)
networkGlobals->initParams.retryTimeout = DEFAULT_NETWORK_RETRY_TIMEOUT;
networkGlobals->networkStartedConnected = TCPIPGetConnectStatus();
if (networkGlobals->networkStartedConnected) {
networkGlobals->gameNetworkState = GAME_NETWORK_CONNECTED;
@ -301,7 +310,7 @@ void NSGS_DisconnectNetwork(void)
if (networkGlobals->gameNetworkState < GAME_NETWORK_CLOSING_TCP) {
TCPIPCloseTCP(networkGlobals->ipid);
networkGlobals->gameNetworkState = GAME_NETWORK_CLOSING_TCP;
networkGlobals->timeout = SHUTDOWN_NETWORK_TIMEOUT;
networkGlobals->timeout = networkGlobals->initParams.shutdownTimeout;
}
}
@ -373,7 +382,7 @@ static void handleSocketError(void)
if (networkGlobals->initParams.displayError != NULL)
networkGlobals->initParams.displayError(NSGS_SOCKET_ERROR, networkGlobals->errorCode);
networkGlobals->gameNetworkState = GAME_NETWORK_FAILURE;
networkGlobals->timeout = NETWORK_RETRY_TIMEOUT;
networkGlobals->timeout = networkGlobals->initParams.retryTimeout;
}
static void handleProtocolFailed(void)
@ -382,7 +391,7 @@ static void handleProtocolFailed(void)
if (networkGlobals->initParams.displayError != NULL)
networkGlobals->initParams.displayError(NSGS_PROTOCOL_ERROR, networkGlobals->errorCode);
networkGlobals->gameNetworkState = GAME_NETWORK_FAILURE;
networkGlobals->timeout = NETWORK_RETRY_TIMEOUT;
networkGlobals->timeout = networkGlobals->initParams.retryTimeout;
}
static void handleFailure(void)
@ -421,7 +430,7 @@ static void handleTcpUnconnected(void)
return;
}
networkGlobals->gameNetworkState = GAME_NETWORK_WAITING_FOR_TCP;
networkGlobals->timeout = TCP_CONNECT_TIMEOUT;
networkGlobals->timeout = networkGlobals->initParams.connectTimeout;
}
static void handleWaitingForTcp(void)
@ -451,7 +460,7 @@ static void handleWaitingForTcp(void)
}
networkGlobals->gameNetworkState = GAME_NETWORK_WAITING_FOR_HELLO;
networkGlobals->timeout = READ_NETWORK_TIMEOUT;
networkGlobals->timeout = networkGlobals->initParams.readTimeout;
networkGlobals->bytesRead = 0;
}
@ -500,7 +509,7 @@ static void handleWaitingForHello(void)
} else {
TCPIPCloseTCP(networkGlobals->ipid);
networkGlobals->gameNetworkState = GAME_NETWORK_CLOSING_TCP;
networkGlobals->timeout = SHUTDOWN_NETWORK_TIMEOUT;
networkGlobals->timeout = networkGlobals->initParams.shutdownTimeout;
}
}
@ -521,7 +530,7 @@ static void handleRequestScores(void)
}
networkGlobals->gameNetworkState = GAME_NETWORK_WAITING_FOR_SCORES;
networkGlobals->timeout = READ_NETWORK_TIMEOUT;
networkGlobals->timeout = networkGlobals->initParams.readTimeout;
networkGlobals->bytesRead = 0;
}
@ -566,7 +575,7 @@ static void handleWaitingForScores(void)
TCPIPCloseTCP(networkGlobals->ipid);
networkGlobals->gameNetworkState = GAME_NETWORK_CLOSING_TCP;
networkGlobals->timeout = SHUTDOWN_NETWORK_TIMEOUT;
networkGlobals->timeout = networkGlobals->initParams.shutdownTimeout;
}
static void handleSetHighScore(void)
@ -587,7 +596,7 @@ static void handleSetHighScore(void)
}
networkGlobals->gameNetworkState = GAME_NETWORK_WAITING_FOR_SCORE_ACK;
networkGlobals->timeout = READ_NETWORK_TIMEOUT;
networkGlobals->timeout = networkGlobals->initParams.readTimeout;
networkGlobals->bytesRead = 0;
}

View File

@ -69,6 +69,26 @@ typedef struct tNSGSHighScoreInitParams
unsigned long secret1;
unsigned long secret2;
/* Each of these timeouts are measured in poll periods. So, if you call NSGS_PollNetwork() every 60th of a
second, then you would use 60 to set the timeout to 1 second. If these are zero, then the "good value"
in the comment will be used as a default.
The shutdown timeout controls how long we wait for a clean TCP disconnection before forcing an abort of
the connection. Two seconds is a good value for this timeout. */
unsigned int shutdownTimeout;
/* The connect timeout is the amount of time we wait for a TCP connection to come up before declaring a
timeout protocol error. Eight seconds is a good value for this timeout. */
unsigned int connectTimeout;
/* The read timeout is the amount of time we wait for a response from the server after we have made a
request of it, whether that is getting the high score list or setting a new high score. Five seconds
is a good value for this timeout. */
unsigned int readTimeout;
/* The retry timeout is the amount of time we wait in an error state before retrying. This only happens
for "soft" errors where a retry is worthwhile. Three minutes is a good value for this timeout. */
unsigned int retryTimeout;
/* This function should display a message to the user that the network is being brought up and they should
be patient when the argument is TRUE and when the argument is FALSE, it should clear that message. This