|
@@ -97,8 +97,62 @@ namespace Shadowsocks.Controller |
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SSRelayEventArgs : EventArgs
|
|
|
|
|
|
{
|
|
|
|
|
|
public readonly Server server;
|
|
|
|
|
|
|
|
|
|
|
|
public SSRelayEventArgs(Server server)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.server = server;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SSInboundEventArgs : SSRelayEventArgs
|
|
|
|
|
|
{
|
|
|
|
|
|
public readonly long length;
|
|
|
|
|
|
public SSInboundEventArgs(Server server, long length) : base(server)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.length = length;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SSOutboundEventArgs : SSRelayEventArgs
|
|
|
|
|
|
{
|
|
|
|
|
|
public readonly long length;
|
|
|
|
|
|
|
|
|
|
|
|
public SSOutboundEventArgs(Server server, long length) : base(server)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.length = length;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SSTCPConnectedEventArgs : SSRelayEventArgs
|
|
|
|
|
|
{
|
|
|
|
|
|
public readonly TimeSpan latency;
|
|
|
|
|
|
|
|
|
|
|
|
public SSTCPConnectedEventArgs(Server server, TimeSpan latency) : base(server)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.latency = latency;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SSTCPClosedEventArgs : SSRelayEventArgs
|
|
|
|
|
|
{
|
|
|
|
|
|
public readonly TCPHandler handler;
|
|
|
|
|
|
|
|
|
|
|
|
public SSTCPClosedEventArgs(Server server, TCPHandler handler) : base(server)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.handler = handler;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
internal class TCPHandler
|
|
|
internal class TCPHandler
|
|
|
{
|
|
|
{
|
|
|
|
|
|
public event EventHandler<SSTCPConnectedEventArgs> OnConnected;
|
|
|
|
|
|
public event EventHandler<SSInboundEventArgs> OnInbound;
|
|
|
|
|
|
public event EventHandler<SSOutboundEventArgs> OnOutbound;
|
|
|
|
|
|
public event EventHandler<SSTCPClosedEventArgs> OnClosed;
|
|
|
|
|
|
|
|
|
class AsyncSession
|
|
|
class AsyncSession
|
|
|
{
|
|
|
{
|
|
|
public IProxy Remote { get; }
|
|
|
public IProxy Remote { get; }
|
|
@@ -245,6 +299,9 @@ namespace Shadowsocks.Controller |
|
|
if (_closed) return;
|
|
|
if (_closed) return;
|
|
|
_closed = true;
|
|
|
_closed = true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OnClosed?.Invoke(this, new SSTCPClosedEventArgs(_server, this));
|
|
|
|
|
|
|
|
|
lock (_tcprelay.Handlers)
|
|
|
lock (_tcprelay.Handlers)
|
|
|
{
|
|
|
{
|
|
|
_tcprelay.Handlers.Remove(this);
|
|
|
_tcprelay.Handlers.Remove(this);
|
|
@@ -344,7 +401,7 @@ namespace Shadowsocks.Controller |
|
|
if (bytesRead >= 5)
|
|
|
if (bytesRead >= 5)
|
|
|
{
|
|
|
{
|
|
|
_command = _connetionRecvBuffer[1];
|
|
|
_command = _connetionRecvBuffer[1];
|
|
|
switch(_command)
|
|
|
|
|
|
|
|
|
switch (_command)
|
|
|
{
|
|
|
{
|
|
|
case CMD_CONNECT:
|
|
|
case CMD_CONNECT:
|
|
|
|
|
|
|
|
@@ -472,7 +529,7 @@ namespace Shadowsocks.Controller |
|
|
break;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
Logger.Debug($"connect to {dstAddr}:{dstPort}");
|
|
|
|
|
|
|
|
|
Logger.Debug($"connect to {dstAddr}:{dstPort}");
|
|
|
|
|
|
|
|
|
_destEndPoint = SocketUtil.GetEndPoint(dstAddr, dstPort);
|
|
|
_destEndPoint = SocketUtil.GetEndPoint(dstAddr, dstPort);
|
|
|
|
|
|
|
|
@@ -755,6 +812,9 @@ namespace Shadowsocks.Controller |
|
|
Logger.Debug($"Socket connected to ss server: {_server.FriendlyName()}");
|
|
|
Logger.Debug($"Socket connected to ss server: {_server.FriendlyName()}");
|
|
|
|
|
|
|
|
|
var latency = DateTime.Now - _startConnectTime;
|
|
|
var latency = DateTime.Now - _startConnectTime;
|
|
|
|
|
|
|
|
|
|
|
|
OnConnected?.Invoke(this, new SSTCPConnectedEventArgs(_server, latency));
|
|
|
|
|
|
|
|
|
IStrategy strategy = _controller.GetCurrentStrategy();
|
|
|
IStrategy strategy = _controller.GetCurrentStrategy();
|
|
|
strategy?.UpdateLatency(_server, latency);
|
|
|
strategy?.UpdateLatency(_server, latency);
|
|
|
_tcprelay.UpdateLatency(_server, latency);
|
|
|
_tcprelay.UpdateLatency(_server, latency);
|
|
@@ -816,6 +876,9 @@ namespace Shadowsocks.Controller |
|
|
var session = (AsyncSession)ar.AsyncState;
|
|
|
var session = (AsyncSession)ar.AsyncState;
|
|
|
int bytesRead = session.Remote.EndReceive(ar);
|
|
|
int bytesRead = session.Remote.EndReceive(ar);
|
|
|
_totalRead += bytesRead;
|
|
|
_totalRead += bytesRead;
|
|
|
|
|
|
|
|
|
|
|
|
OnInbound?.Invoke(this, new SSInboundEventArgs(_server, bytesRead));
|
|
|
|
|
|
|
|
|
_tcprelay.UpdateInboundCounter(_server, bytesRead);
|
|
|
_tcprelay.UpdateInboundCounter(_server, bytesRead);
|
|
|
if (bytesRead > 0)
|
|
|
if (bytesRead > 0)
|
|
|
{
|
|
|
{
|
|
@@ -907,6 +970,8 @@ namespace Shadowsocks.Controller |
|
|
return;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OnOutbound?.Invoke(this, new SSOutboundEventArgs(_server, bytesToSend));
|
|
|
_tcprelay.UpdateOutboundCounter(_server, bytesToSend);
|
|
|
_tcprelay.UpdateOutboundCounter(_server, bytesToSend);
|
|
|
_startSendingTime = DateTime.Now;
|
|
|
_startSendingTime = DateTime.Now;
|
|
|
session.Remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None,
|
|
|
session.Remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None,
|
|
|