Index: src/server/sv_client.c =================================================================== --- src/server/sv_client.c (revision 1043) +++ src/server/sv_client.c (working copy) @@ -69,7 +69,6 @@ // this is the first time this client has asked for a challenge challenge = &svs.challenges[oldest]; - challenge->challenge = ( (rand() << 16) ^ rand() ) ^ svs.time; challenge->adr = from; challenge->firstTime = svs.time; challenge->time = svs.time; @@ -78,7 +77,11 @@ } // send the challengeResponse - challenge->pingTime = svs.time; + if ( !challenge->inuse ) { + challenge->pingTime = svs.time; + challenge->challenge = ( (rand() << 16) ^ rand() ) ^ svs.time; + challenge->inuse = qtrue; + } NET_OutOfBandPrint( NS_SERVER, from, "challengeResponse %i", challenge->challenge ); } @@ -341,6 +344,7 @@ for (i = 0 ; i < MAX_CHALLENGES ; i++, challenge++) { if ( NET_CompareAdr( drop->netchan.remoteAddress, challenge->adr ) ) { challenge->connected = qfalse; + challenge->inuse = qfalse; break; } } Index: src/server/server.h =================================================================== --- src/server/server.h (revision 1043) +++ src/server/server.h (working copy) @@ -189,6 +189,7 @@ int pingTime; // time the challenge response was sent to client int firstTime; // time the adr was first used, for authorize timeout checks qboolean connected; + qboolean inuse; } challenge_t; Index: src/server/sv_main.c =================================================================== --- src/server/sv_main.c (revision 1043) +++ src/server/sv_main.c (working copy) @@ -542,7 +542,13 @@ } else if (!Q_stricmp(c, "getchallenge")) { SV_GetChallenge( from ); } else if (!Q_stricmp(c, "connect")) { + int i; SV_DirectConnect( from ); + for (i=0 ; i<MAX_CHALLENGES ; i++) { + if (NET_CompareAdr(from, svs.challenges[i].adr)) { + svs.challenges[i].inuse = qfalse; + } + } } else if (!Q_stricmp(c, "rcon")) { SVC_RemoteCommand( from, msg ); } else if (!Q_stricmp(c, "disconnect")) {