Browse Source

add retry

tags/2.5
clowwindy 10 years ago
parent
commit
8c869ca38e
1 changed files with 39 additions and 7 deletions
  1. +39
    -7
      shadowsocks-csharp/Controller/Service/TCPRelay.cs

+ 39
- 7
shadowsocks-csharp/Controller/Service/TCPRelay.cs View File

@@ -31,9 +31,6 @@ namespace Shadowsocks.Controller
socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
Handler handler = new Handler(); Handler handler = new Handler();
handler.connection = socket; handler.connection = socket;
Server server = _controller.GetCurrentStrategy().GetAServer(IStrategyCallerType.TCP, (IPEndPoint)socket.RemoteEndPoint);
handler.encryptor = EncryptorFactory.GetEncryptor(server.method, server.password);
handler.server = server;
handler.controller = _controller; handler.controller = _controller;
handler.Start(firstPacket, length); handler.Start(firstPacket, length);
@@ -50,6 +47,7 @@ namespace Shadowsocks.Controller
public Socket remote; public Socket remote;
public Socket connection; public Socket connection;
public ShadowsocksController controller; public ShadowsocksController controller;
private int retryCount = 0;
private byte command; private byte command;
private byte[] _firstPacket; private byte[] _firstPacket;
@@ -80,6 +78,13 @@ namespace Shadowsocks.Controller
private DateTime _startConnectTime; private DateTime _startConnectTime;
public void CreateRemote()
{
Server server = controller.GetCurrentStrategy().GetAServer(IStrategyCallerType.TCP, (IPEndPoint)connection.RemoteEndPoint);
this.encryptor = EncryptorFactory.GetEncryptor(server.method, server.password);
this.server = server;
}
public void Start(byte[] firstPacket, int length) public void Start(byte[] firstPacket, int length)
{ {
this._firstPacket = firstPacket; this._firstPacket = firstPacket;
@@ -133,7 +138,10 @@ namespace Shadowsocks.Controller
{ {
lock (decryptionLock) lock (decryptionLock)
{ {
((IDisposable)encryptor).Dispose();
if (encryptor != null)
{
((IDisposable)encryptor).Dispose();
}
} }
} }
} }
@@ -215,7 +223,7 @@ namespace Shadowsocks.Controller
if (command == 1) if (command == 1)
{ {
byte[] response = { 5, 0, 0, 1, 0, 0, 0, 0, 0, 0 }; byte[] response = { 5, 0, 0, 1, 0, 0, 0, 0, 0, 0 };
connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(StartConnect), null);
connection.BeginSend(response, 0, response.Length, 0, new AsyncCallback(ResponseCallback), null);
} }
else if (command == 3) else if (command == 3)
{ {
@@ -292,12 +300,27 @@ namespace Shadowsocks.Controller
} }
} }
private void StartConnect(IAsyncResult ar)
private void ResponseCallback(IAsyncResult ar)
{ {
try try
{ {
connection.EndSend(ar); connection.EndSend(ar);
StartConnect();
}
catch (Exception e)
{
Logging.LogUsefulException(e);
this.Close();
}
}
private void StartConnect()
{
try
{
CreateRemote();
// TODO async resolving // TODO async resolving
IPAddress ipAddress; IPAddress ipAddress;
bool parsed = IPAddress.TryParse(server.server, out ipAddress); bool parsed = IPAddress.TryParse(server.server, out ipAddress);
@@ -349,7 +372,16 @@ namespace Shadowsocks.Controller
{ {
controller.GetCurrentStrategy().SetFailure(this.server); controller.GetCurrentStrategy().SetFailure(this.server);
Logging.LogUsefulException(e); Logging.LogUsefulException(e);
this.Close();
if (retryCount < 3)
{
Console.WriteLine("Connection failed, retrying");
StartConnect();
retryCount++;
}
else
{
this.Close();
}
} }
} }


Loading…
Cancel
Save