summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/net_server.c41
1 files changed, 31 insertions, 10 deletions
diff --git a/src/net_server.c b/src/net_server.c
index af794d02..fb676843 100644
--- a/src/net_server.c
+++ b/src/net_server.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: net_server.c 680 2006-09-29 21:25:13Z fraggle $
+// $Id: net_server.c 682 2006-09-30 10:22:48Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -387,17 +387,13 @@ static int NET_SV_NumClients(void)
return count;
}
+// Find the latest tic which has been acknowledged as received by
+// all clients.
-// Possibly advance the recv window if all connected clients have
-// used the data in the window
-
-static void NET_SV_AdvanceWindow(void)
+static int NET_SV_LatestAcknowledged(void)
{
- int i;
int lowtic = -1;
-
- // Find the smallest value of client->acknowledged for all connected
- // clients
+ int i;
for (i=0; i<MAXNETNODES; ++i)
{
@@ -410,6 +406,20 @@ static void NET_SV_AdvanceWindow(void)
}
}
+ return lowtic;
+}
+
+
+// Possibly advance the recv window if all connected clients have
+// used the data in the window
+
+static void NET_SV_AdvanceWindow(void)
+{
+ int lowtic;
+ int i;
+
+ lowtic = NET_SV_LatestAcknowledged();
+
if (lowtic < 0)
{
return;
@@ -648,7 +658,8 @@ static void NET_SV_ParseSYN(net_packet_t *packet,
NET_SV_AssignPlayers();
num_players = NET_SV_NumPlayers();
- if (num_players >= MAXPLAYERS)
+ if ((!cl_drone && num_players >= MAXPLAYERS)
+ || NET_SV_NumClients() >= MAXNETNODES)
{
NET_SV_SendReject(addr, "Server is full!");
return;
@@ -1280,6 +1291,16 @@ static void NET_SV_PumpSendQueue(net_client_t *client)
int i;
int starttic, endtic;
+ // If a client has not sent any acknowledgments for a while,
+ // wait until they catch up.
+
+ if (client->sendseq - NET_SV_LatestAcknowledged() > 40)
+ {
+ return;
+ }
+
+ // Work out the index into the receive window
+
recv_index = client->sendseq - recvwindow_start;
if (recv_index < 0 || recv_index >= BACKUPTICS)