|
|
@@ -7,11 +7,11 @@ namespace Shadowsocks.Controller |
|
|
|
{
|
|
|
|
class PortForwarder : Listener.Service
|
|
|
|
{
|
|
|
|
int _targetPort;
|
|
|
|
private readonly int _targetPort;
|
|
|
|
|
|
|
|
public PortForwarder(int targetPort)
|
|
|
|
{
|
|
|
|
this._targetPort = targetPort;
|
|
|
|
_targetPort = targetPort;
|
|
|
|
}
|
|
|
|
|
|
|
|
public override bool Handle(byte[] firstPacket, int length, Socket socket, object state)
|
|
|
@@ -20,11 +20,11 @@ namespace Shadowsocks.Controller |
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
new Handler().Start(firstPacket, length, socket, this._targetPort);
|
|
|
|
new Handler().Start(firstPacket, length, socket, _targetPort);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
class Handler
|
|
|
|
private class Handler
|
|
|
|
{
|
|
|
|
private byte[] _firstPacket;
|
|
|
|
private int _firstPacketLength;
|
|
|
@@ -33,7 +33,7 @@ namespace Shadowsocks.Controller |
|
|
|
private bool _closed = false;
|
|
|
|
private bool _localShutdown = false;
|
|
|
|
private bool _remoteShutdown = false;
|
|
|
|
public const int RecvSize = 16384;
|
|
|
|
private const int RecvSize = 2048;
|
|
|
|
// remote receive buffer
|
|
|
|
private byte[] remoteRecvBuffer = new byte[RecvSize];
|
|
|
|
// connection receive buffer
|
|
|
@@ -44,9 +44,9 @@ namespace Shadowsocks.Controller |
|
|
|
|
|
|
|
public void Start(byte[] firstPacket, int length, Socket socket, int targetPort)
|
|
|
|
{
|
|
|
|
this._firstPacket = firstPacket;
|
|
|
|
this._firstPacketLength = length;
|
|
|
|
this._local = socket;
|
|
|
|
_firstPacket = firstPacket;
|
|
|
|
_firstPacketLength = length;
|
|
|
|
_local = socket;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
EndPoint remoteEP = SocketUtil.GetEndPoint("127.0.0.1", targetPort);
|
|
|
@@ -58,7 +58,7 @@ namespace Shadowsocks.Controller |
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
Logging.LogUsefulException(e);
|
|
|
|
this.Close();
|
|
|
|
Close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
@@ -77,7 +77,7 @@ namespace Shadowsocks.Controller |
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
Logging.LogUsefulException(e);
|
|
|
|
this.Close();
|
|
|
|
Close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
@@ -89,12 +89,12 @@ namespace Shadowsocks.Controller |
|
|
|
}
|
|
|
|
try
|
|
|
|
{
|
|
|
|
_remote.BeginSend(_firstPacket, 0, _firstPacketLength, 0, new AsyncCallback(StartPipe), null);
|
|
|
|
_remote.BeginSend(_firstPacket, 0, _firstPacketLength, 0, StartPipe, null);
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
Logging.LogUsefulException(e);
|
|
|
|
this.Close();
|
|
|
|
Close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
@@ -108,14 +108,14 @@ namespace Shadowsocks.Controller |
|
|
|
{
|
|
|
|
_remote.EndSend(ar);
|
|
|
|
_remote.BeginReceive(remoteRecvBuffer, 0, RecvSize, 0,
|
|
|
|
new AsyncCallback(PipeRemoteReceiveCallback), null);
|
|
|
|
PipeRemoteReceiveCallback, null);
|
|
|
|
_local.BeginReceive(connetionRecvBuffer, 0, RecvSize, 0,
|
|
|
|
new AsyncCallback(PipeConnectionReceiveCallback), null);
|
|
|
|
PipeConnectionReceiveCallback, null);
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
Logging.LogUsefulException(e);
|
|
|
|
this.Close();
|
|
|
|
Close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
@@ -128,10 +128,9 @@ namespace Shadowsocks.Controller |
|
|
|
try
|
|
|
|
{
|
|
|
|
int bytesRead = _remote.EndReceive(ar);
|
|
|
|
|
|
|
|
if (bytesRead > 0)
|
|
|
|
{
|
|
|
|
_local.BeginSend(remoteRecvBuffer, 0, bytesRead, 0, new AsyncCallback(PipeConnectionSendCallback), null);
|
|
|
|
_local.BeginSend(remoteRecvBuffer, 0, bytesRead, 0, PipeConnectionSendCallback, null);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
@@ -143,7 +142,7 @@ namespace Shadowsocks.Controller |
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
Logging.LogUsefulException(e);
|
|
|
|
this.Close();
|
|
|
|
Close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
@@ -156,10 +155,9 @@ namespace Shadowsocks.Controller |
|
|
|
try
|
|
|
|
{
|
|
|
|
int bytesRead = _local.EndReceive(ar);
|
|
|
|
|
|
|
|
if (bytesRead > 0)
|
|
|
|
{
|
|
|
|
_remote.BeginSend(connetionRecvBuffer, 0, bytesRead, 0, new AsyncCallback(PipeRemoteSendCallback), null);
|
|
|
|
_remote.BeginSend(connetionRecvBuffer, 0, bytesRead, 0, PipeRemoteSendCallback, null);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
@@ -171,7 +169,7 @@ namespace Shadowsocks.Controller |
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
Logging.LogUsefulException(e);
|
|
|
|
this.Close();
|
|
|
|
Close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
@@ -184,13 +182,13 @@ namespace Shadowsocks.Controller |
|
|
|
try
|
|
|
|
{
|
|
|
|
_remote.EndSend(ar);
|
|
|
|
_local.BeginReceive(this.connetionRecvBuffer, 0, RecvSize, 0,
|
|
|
|
new AsyncCallback(PipeConnectionReceiveCallback), null);
|
|
|
|
_local.BeginReceive(connetionRecvBuffer, 0, RecvSize, 0,
|
|
|
|
PipeConnectionReceiveCallback, null);
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
Logging.LogUsefulException(e);
|
|
|
|
this.Close();
|
|
|
|
Close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
@@ -203,13 +201,13 @@ namespace Shadowsocks.Controller |
|
|
|
try
|
|
|
|
{
|
|
|
|
_local.EndSend(ar);
|
|
|
|
_remote.BeginReceive(this.remoteRecvBuffer, 0, RecvSize, 0,
|
|
|
|
new AsyncCallback(PipeRemoteReceiveCallback), null);
|
|
|
|
_remote.BeginReceive(remoteRecvBuffer, 0, RecvSize, 0,
|
|
|
|
PipeRemoteReceiveCallback, null);
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
Logging.LogUsefulException(e);
|
|
|
|
this.Close();
|
|
|
|
Close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
@@ -217,7 +215,7 @@ namespace Shadowsocks.Controller |
|
|
|
{
|
|
|
|
if (_localShutdown && _remoteShutdown)
|
|
|
|
{
|
|
|
|
this.Close();
|
|
|
|
Close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|