aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/ClientView.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ClientStack/ClientView.cs40
1 files changed, 31 insertions, 9 deletions
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
index 52749a1..0fe3884 100644
--- a/OpenSim/Region/ClientStack/ClientView.cs
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -25,6 +25,7 @@
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26* 26*
27*/ 27*/
28using System;
28using System.Collections.Generic; 29using System.Collections.Generic;
29using System.Net; 30using System.Net;
30using System.Text; 31using System.Text;
@@ -77,6 +78,11 @@ namespace OpenSim.Region.ClientStack
77 private int cachedtextureserial = 0; 78 private int cachedtextureserial = 0;
78 protected AuthenticateSessionsBase m_authenticateSessionsHandler; 79 protected AuthenticateSessionsBase m_authenticateSessionsHandler;
79 private Encoding enc = Encoding.ASCII; 80 private Encoding enc = Encoding.ASCII;
81 // Dead client detection vars
82 private Timer clientPingTimer;
83 private int packetsReceived = 0;
84 private int probesWithNoIngressPackets = 0;
85 private int lastPacketsReceived = 0;
80 86
81 public ClientView(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, Dictionary<uint, ClientView> clientThreads, IWorld world, AssetCache assetCache, PacketServer packServer, InventoryCache inventoryCache, AuthenticateSessionsBase authenSessions ) 87 public ClientView(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, Dictionary<uint, ClientView> clientThreads, IWorld world, AssetCache assetCache, PacketServer packServer, InventoryCache inventoryCache, AuthenticateSessionsBase authenSessions )
82 { 88 {
@@ -112,15 +118,7 @@ namespace OpenSim.Region.ClientStack
112 118
113 public void KillClient() 119 public void KillClient()
114 { 120 {
115 KillObjectPacket kill = new KillObjectPacket(); 121 clientPingTimer.Stop();
116 kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
117 kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
118 //kill.ObjectData[0].ID = this.ClientAvatar.localid;
119 foreach (ClientView client in m_clientThreads.Values)
120 {
121 client.OutPacket(kill);
122 }
123
124 this.m_inventoryCache.ClientLeaving(this.AgentID, null); 122 this.m_inventoryCache.ClientLeaving(this.AgentID, null);
125 m_world.RemoveClient(this.AgentId); 123 m_world.RemoveClient(this.AgentId);
126 124
@@ -193,6 +191,9 @@ namespace OpenSim.Region.ClientStack
193 if (nextPacket.Incoming) 191 if (nextPacket.Incoming)
194 { 192 {
195 //is a incoming packet 193 //is a incoming packet
194 if (nextPacket.Packet.Type != PacketType.AgentUpdate) {
195 packetsReceived++;
196 }
196 ProcessInPacket(nextPacket.Packet); 197 ProcessInPacket(nextPacket.Packet);
197 } 198 }
198 else 199 else
@@ -204,10 +205,31 @@ namespace OpenSim.Region.ClientStack
204 } 205 }
205 # endregion 206 # endregion
206 207
208 protected void CheckClientConnectivity(object sender, ElapsedEventArgs e)
209 {
210 if (packetsReceived == lastPacketsReceived) {
211 probesWithNoIngressPackets++;
212 if (probesWithNoIngressPackets > 30) {
213 this.KillClient();
214 } else {
215 // this will normally trigger at least one packet (ping response)
216 SendStartPingCheck(0);
217 }
218 } else {
219 // Something received in the meantime - we can reset the counters
220 probesWithNoIngressPackets = 0;
221 lastPacketsReceived = packetsReceived;
222 }
223 }
224
207 # region Setup 225 # region Setup
208 226
209 protected virtual void InitNewClient() 227 protected virtual void InitNewClient()
210 { 228 {
229 clientPingTimer = new Timer(1000);
230 clientPingTimer.Elapsed += new ElapsedEventHandler(CheckClientConnectivity);
231 clientPingTimer.Enabled = true;
232
211 MainLog.Instance.Verbose( "OpenSimClient.cs:InitNewClient() - Adding viewer agent to world"); 233 MainLog.Instance.Verbose( "OpenSimClient.cs:InitNewClient() - Adding viewer agent to world");
212 this.m_world.AddNewClient(this, false); 234 this.m_world.AddNewClient(this, false);
213 } 235 }