From 5adda79c5a35aeb50f12b85572d74f97531c2ad1 Mon Sep 17 00:00:00 2001 From: Date: Sat, 30 Aug 2008 18:23:15 +0000 Subject: [PATCH] Added timeout to Simian for disconnecting users after no packets are received for 10 seconds git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@2189 52acb1d6-8a22-11de-b505-999d5b087335 --- Programs/Simian/Agent.cs | 1 + Programs/Simian/Extensions/UDPServer.cs | 17 +++++++++++++++-- Programs/Simian/Simian.cs | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Programs/Simian/Agent.cs b/Programs/Simian/Agent.cs index 2330ada7..ee4af900 100644 --- a/Programs/Simian/Agent.cs +++ b/Programs/Simian/Agent.cs @@ -20,6 +20,7 @@ namespace Simian public bool Running; public int TickFall; public int TickJump; + public int TickLastPacketReceived; public AgentManager.ControlFlags ControlFlags = AgentManager.ControlFlags.NONE; public AnimationSet Animations = new AnimationSet(); public Dictionary Inventory = new Dictionary(); diff --git a/Programs/Simian/Extensions/UDPServer.cs b/Programs/Simian/Extensions/UDPServer.cs index ccc90dd1..0795432a 100644 --- a/Programs/Simian/Extensions/UDPServer.cs +++ b/Programs/Simian/Extensions/UDPServer.cs @@ -35,7 +35,7 @@ namespace Simian Settings.NETWORK_TICK_INTERVAL); } - public void Dispose() + public void Shutdown() { ackTimer.Dispose(); } @@ -288,7 +288,7 @@ namespace Simian lock (client.NeedAcks) { foreach (uint ack in acks) - client.NeedAcks.Remove(ack); + client.NeedAcks.Remove(ack); } } @@ -366,6 +366,17 @@ namespace Simian packet.Header.Sequence, packet.GetType(), packet.ResendCount), Helpers.LogLevel.Warning); dropAck.Add(packet.Header.Sequence); + + //Disconnect an agent if no packets are received for some time + //TODO: Send logout packet? Also, 10000 should be a setting somewhere. + if (Environment.TickCount - client.Agent.TickLastPacketReceived > 10000) + { + Logger.Log(String.Format("Ack timeout for {0}, disconnecting", client.Agent.Avatar.Name), Helpers.LogLevel.Warning); + UUID remove = client.Agent.AgentID; + client.Shutdown(); + lock (server.Agents) server.Agents.Remove(remove); + return; + } } } } @@ -442,6 +453,8 @@ namespace Simian } } + client.Agent.TickLastPacketReceived = Environment.TickCount; + // Reliable handling if (packet.Header.Reliable) { diff --git a/Programs/Simian/Simian.cs b/Programs/Simian/Simian.cs index 25f2d6a5..058a8bf6 100644 --- a/Programs/Simian/Simian.cs +++ b/Programs/Simian/Simian.cs @@ -335,6 +335,7 @@ namespace Simian agent.Flags = PrimFlags.Physics | PrimFlags.ObjectModify | PrimFlags.ObjectCopy | PrimFlags.ObjectAnyOwner | PrimFlags.ObjectMove | PrimFlags.InventoryEmpty | PrimFlags.ObjectTransfer | PrimFlags.ObjectOwnerModify | PrimFlags.ObjectYouOwner; + agent.TickLastPacketReceived = Environment.TickCount; // Setup the agent inventory InventoryFolder rootFolder = new InventoryFolder();