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);
Handler handler = new Handler();
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.Start(firstPacket, length);
@@ -50,6 +47,7 @@ namespace Shadowsocks.Controller
public Socket remote;
public Socket connection;
public ShadowsocksController controller;
private int retryCount = 0;
private byte command;
private byte[] _firstPacket;
@@ -80,6 +78,13 @@ namespace Shadowsocks.Controller
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)
{
this._firstPacket = firstPacket;
@@ -133,7 +138,10 @@ namespace Shadowsocks.Controller
{
lock (decryptionLock)
{
((IDisposable)encryptor).Dispose();
if (encryptor != null)
{
((IDisposable)encryptor).Dispose();
}
}
}
}
@@ -215,7 +223,7 @@ namespace Shadowsocks.Controller
if (command == 1)
{
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)
{
@@ -292,12 +300,27 @@ namespace Shadowsocks.Controller
}
}
private void StartConnect(IAsyncResult ar)
private void ResponseCallback(IAsyncResult ar)
{
try
{
connection.EndSend(ar);
StartConnect();
}
catch (Exception e)
{
Logging.LogUsefulException(e);
this.Close();
}
}
private void StartConnect()
{
try
{
CreateRemote();
// TODO async resolving
IPAddress ipAddress;
bool parsed = IPAddress.TryParse(server.server, out ipAddress);
@@ -349,7 +372,16 @@ namespace Shadowsocks.Controller
{
controller.GetCurrentStrategy().SetFailure(this.server);
Logging.LogUsefulException(e);
this.Close();
if (retryCount < 3)
{
Console.WriteLine("Connection failed, retrying");
StartConnect();
retryCount++;
}
else
{
this.Close();
}
}
}


Loading…
Cancel
Save