Browse Source

add handler timeout

tags/2.5.6
clowwindy 10 years ago
parent
commit
750ee4fa5f
1 changed files with 25 additions and 1 deletions
  1. +25
    -1
      shadowsocks-csharp/Controller/Service/TCPRelay.cs

+ 25
- 1
shadowsocks-csharp/Controller/Service/TCPRelay.cs View File

@@ -14,6 +14,7 @@ namespace Shadowsocks.Controller
class TCPRelay : Listener.Service class TCPRelay : Listener.Service
{ {
private ShadowsocksController _controller; private ShadowsocksController _controller;
private DateTime _lastSweepTime;
public ISet<Handler> Handlers public ISet<Handler> Handlers
{ {
@@ -24,6 +25,7 @@ namespace Shadowsocks.Controller
{ {
this._controller = controller; this._controller = controller;
this.Handlers = new HashSet<Handler>(); this.Handlers = new HashSet<Handler>();
this._lastSweepTime = DateTime.Now;
} }
public bool Handle(byte[] firstPacket, int length, Socket socket, object state) public bool Handle(byte[] firstPacket, int length, Socket socket, object state)
@@ -43,12 +45,30 @@ namespace Shadowsocks.Controller
handler.relay = this; handler.relay = this;
handler.Start(firstPacket, length); handler.Start(firstPacket, length);
IList<Handler> handlersToClose = new List<Handler>();
lock (this.Handlers) lock (this.Handlers)
{ {
this.Handlers.Add(handler); this.Handlers.Add(handler);
Logging.Debug($"connections: {Handlers.Count}"); 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 ShadowsocksController controller;
public TCPRelay relay; public TCPRelay relay;
public DateTime lastActivity;
private int retryCount = 0; private int retryCount = 0;
private bool connected; private bool connected;
@@ -111,6 +133,7 @@ namespace Shadowsocks.Controller
this._firstPacket = firstPacket; this._firstPacket = firstPacket;
this._firstPacketLength = length; this._firstPacketLength = length;
this.HandshakeReceive(); this.HandshakeReceive();
this.lastActivity = DateTime.Now;
} }
private void CheckClose() private void CheckClose()
@@ -505,6 +528,7 @@ namespace Shadowsocks.Controller
if (bytesRead > 0) if (bytesRead > 0)
{ {
this.lastActivity = DateTime.Now;
int bytesToSend; int bytesToSend;
lock (decryptionLock) lock (decryptionLock)
{ {


Loading…
Cancel
Save