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")) {