From 750ee4fa5ffb2e7dd63f675438e6296333410553 Mon Sep 17 00:00:00 2001 From: clowwindy Date: Tue, 18 Aug 2015 21:31:50 -0700 Subject: [PATCH] add handler timeout --- .../Controller/Service/TCPRelay.cs | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/shadowsocks-csharp/Controller/Service/TCPRelay.cs b/shadowsocks-csharp/Controller/Service/TCPRelay.cs index 3fc27e39..667a11a6 100644 --- a/shadowsocks-csharp/Controller/Service/TCPRelay.cs +++ b/shadowsocks-csharp/Controller/Service/TCPRelay.cs @@ -14,6 +14,7 @@ namespace Shadowsocks.Controller class TCPRelay : Listener.Service { private ShadowsocksController _controller; + private DateTime _lastSweepTime; public ISet Handlers { @@ -24,6 +25,7 @@ namespace Shadowsocks.Controller { this._controller = controller; this.Handlers = new HashSet(); + this._lastSweepTime = DateTime.Now; } public bool Handle(byte[] firstPacket, int length, Socket socket, object state) @@ -43,12 +45,30 @@ namespace Shadowsocks.Controller handler.relay = this; handler.Start(firstPacket, length); + IList handlersToClose = new List(); lock (this.Handlers) { this.Handlers.Add(handler); Logging.Debug($"connections: {Handlers.Count}"); + DateTime now = DateTime.Now; + if (now - _lastSweepTime > TimeSpan.FromSeconds(1)) + { + _lastSweepTime = now; + foreach (Handler handler1 in this.Handlers) + { + if (now - handler1.lastActivity > TimeSpan.FromSeconds(1800)) + { + handlersToClose.Add(handler1); + } + } + } + } + foreach (Handler handler1 in handlersToClose) + { + Logging.Debug("Closing timed out connection"); + handler1.Close(); } - return true; + return true; } } @@ -63,6 +83,8 @@ namespace Shadowsocks.Controller public ShadowsocksController controller; public TCPRelay relay; + public DateTime lastActivity; + private int retryCount = 0; private bool connected; @@ -111,6 +133,7 @@ namespace Shadowsocks.Controller this._firstPacket = firstPacket; this._firstPacketLength = length; this.HandshakeReceive(); + this.lastActivity = DateTime.Now; } private void CheckClose() @@ -505,6 +528,7 @@ namespace Shadowsocks.Controller if (bytesRead > 0) { + this.lastActivity = DateTime.Now; int bytesToSend; lock (decryptionLock) {