Skip to content
Permalink
Browse files
(svn r4267) - Fix (r4241): also validate the error number that a clie…
…nt receives from a server, and encapsulate this functionality into GetNetworkErrorMsg().
  • Loading branch information
Darkvater committed Apr 3, 2006
1 parent ce19e9b commit 7d232cf978f244bf45274488620b4a59ab3aaba8
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 30 deletions.
@@ -256,6 +256,36 @@ static void NetworkClientError(byte res, NetworkClientState *cs) {
_networking = false;
}

/** Retrieve a string representation of an internal error number
* @param buf buffer where the error message will be stored
* @param err NetworkErrorCode (integer)
* @return returns a pointer to the error message (buf) */
char *GetNetworkErrorMsg(char *buf, NetworkErrorCode err)
{
/* List of possible network errors, used by
* PACKET_SERVER_ERROR and PACKET_CLIENT_ERROR */
static const StringID network_error_strings[] = {
STR_NETWORK_ERR_CLIENT_GENERAL,
STR_NETWORK_ERR_CLIENT_DESYNC,
STR_NETWORK_ERR_CLIENT_SAVEGAME,
STR_NETWORK_ERR_CLIENT_CONNECTION_LOST,
STR_NETWORK_ERR_CLIENT_PROTOCOL_ERROR,
STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED,
STR_NETWORK_ERR_CLIENT_NOT_EXPECTED,
STR_NETWORK_ERR_CLIENT_WRONG_REVISION,
STR_NETWORK_ERR_CLIENT_NAME_IN_USE,
STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD,
STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH,
STR_NETWORK_ERR_CLIENT_KICKED,
STR_NETWORK_ERR_CLIENT_CHEATER,
STR_NETWORK_ERR_CLIENT_SERVER_FULL,
};

if (err >= lengthof(network_error_strings)) err = 0;

return GetString(buf, network_error_strings[err]);
}

// Find all IP-aliases for this host
static void NetworkFindIPs(void)
{
@@ -524,7 +554,7 @@ void NetworkCloseClient(NetworkClientState *cs)

NetworkGetClientName(client_name, sizeof(client_name), cs);

GetString(str, STR_NETWORK_ERR_CLIENT_GENERAL + errorno);
GetNetworkErrorMsg(str, errorno);

NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, client_name, "%s", str);

@@ -676,15 +676,12 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CHAT)

DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR_QUIT)
{
int errorno;
char str[100];
uint16 index;
NetworkClientInfo *ci;

index = NetworkRecv_uint16(MY_CLIENT, p);
errorno = NetworkRecv_uint8(MY_CLIENT, p);

GetString(str, STR_NETWORK_ERR_CLIENT_GENERAL + errorno);
GetNetworkErrorMsg(str, NetworkRecv_uint8(MY_CLIENT, p));

ci = NetworkFindClientInfoFromIndex(index);
if (ci != NULL) {
@@ -229,6 +229,7 @@ NetworkClientInfo *NetworkFindClientInfoFromIndex(uint16 client_index);
NetworkClientInfo *NetworkFindClientInfoFromIP(const char *ip);
NetworkClientState *NetworkFindClientStateFromIndex(uint16 client_index);
unsigned long NetworkResolveHost(const char *hostname);
char *GetNetworkErrorMsg(char *buf, NetworkErrorCode err);

#endif /* ENABLE_NETWORK */

@@ -26,24 +26,6 @@
static void NetworkHandleCommandQueue(NetworkClientState* cs);
void NetworkPopulateCompanyInfo(void);

/* List of possible network errors, used by PACKET_SERVER_ERROR and PACKET_CLIENT_ERROR */
static const StringID _network_error_strings[] = {
STR_NETWORK_ERR_CLIENT_GENERAL,
STR_NETWORK_ERR_CLIENT_DESYNC,
STR_NETWORK_ERR_CLIENT_SAVEGAME,
STR_NETWORK_ERR_CLIENT_CONNECTION_LOST,
STR_NETWORK_ERR_CLIENT_PROTOCOL_ERROR,
STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED,
STR_NETWORK_ERR_CLIENT_NOT_EXPECTED,
STR_NETWORK_ERR_CLIENT_WRONG_REVISION,
STR_NETWORK_ERR_CLIENT_NAME_IN_USE,
STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD,
STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH,
STR_NETWORK_ERR_CLIENT_KICKED,
STR_NETWORK_ERR_CLIENT_CHEATER,
STR_NETWORK_ERR_CLIENT_SERVER_FULL,
};

// **********
// Sending functions
// DEF_SERVER_SEND_COMMAND has parameter: NetworkClientState *cs
@@ -162,12 +144,10 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkClientState *cs, Netwo

Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR);

if (error >= lengthof(_network_error_strings)) error = 0;

NetworkSend_uint8(p, error);
NetworkSend_Packet(p, cs);

GetString(str, _network_error_strings[error]);
GetNetworkErrorMsg(str, error);

// Only send when the current client was in game
if (cs->status > STATUS_AUTH) {
@@ -901,8 +881,8 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR)
// This packets means a client noticed an error and is reporting this
// to us. Display the error and report it to the other clients
NetworkClientState *new_cs;
NetworkErrorCode errorno = NetworkRecv_uint8(cs, p);
char str[100];
NetworkErrorCode errorno = NetworkRecv_uint8(cs, p);
char client_name[NETWORK_CLIENT_NAME_LENGTH];

// The client was never joined.. thank the client for the packet, but ignore it
@@ -913,9 +893,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR)

NetworkGetClientName(client_name, sizeof(client_name), cs);

if (errorno >= lengthof(_network_error_strings)) errorno = 0;

GetString(str, _network_error_strings[errorno]);
GetNetworkErrorMsg(str, errorno);

DEBUG(net, 2)("[NET] %s reported an error and is closing his connection (%s)", client_name, str);

0 comments on commit 7d232cf

Please sign in to comment.