|
|
@@ -167,9 +167,9 @@ namespace Shadowsocks.Controller |
|
|
|
records.Add(id, record); |
|
|
|
if (Config.Ping) |
|
|
|
{ |
|
|
|
MyPing ping = new MyPing(server, Repeat, record); |
|
|
|
MyPing ping = new MyPing(server, Repeat); |
|
|
|
ping.Completed += ping_Completed; |
|
|
|
ping.Start(); |
|
|
|
ping.Start(record); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -181,8 +181,8 @@ namespace Shadowsocks.Controller |
|
|
|
|
|
|
|
private void ping_Completed(object sender, MyPing.CompletedEventArgs e) |
|
|
|
{ |
|
|
|
Server server = ((MyPing)sender).server; |
|
|
|
StatisticsRecord record = (StatisticsRecord)((MyPing)sender).userstate; |
|
|
|
Server server = e.Server; |
|
|
|
StatisticsRecord record = (StatisticsRecord)e.UserState; |
|
|
|
record.SetResponse(e.RoundtripTime); |
|
|
|
Logging.Debug($"Ping {server.FriendlyName()} {e.RoundtripTime.Count} times, {(100 - record.PackageLoss * 100)}% packages loss, min {record.MinResponse} ms, max {record.MaxResponse} ms, avg {record.AverageResponse} ms"); |
|
|
|
} |
|
|
@@ -310,32 +310,30 @@ namespace Shadowsocks.Controller |
|
|
|
public const int TimeoutMilliseconds = 500; |
|
|
|
|
|
|
|
public EventHandler<CompletedEventArgs> Completed; |
|
|
|
public Server server; |
|
|
|
public object userstate; |
|
|
|
private Server server; |
|
|
|
|
|
|
|
private int repeat; |
|
|
|
private IPAddress ip; |
|
|
|
private Ping ping; |
|
|
|
private List<int?> RoundtripTime; |
|
|
|
|
|
|
|
public MyPing(Server server, int repeat, object userstate) |
|
|
|
public MyPing(Server server, int repeat) |
|
|
|
{ |
|
|
|
this.server = server; |
|
|
|
this.repeat = repeat; |
|
|
|
this.userstate = userstate; |
|
|
|
RoundtripTime = new List<int?>(repeat); |
|
|
|
ping = new Ping(); |
|
|
|
ping.PingCompleted += Ping_PingCompleted; |
|
|
|
} |
|
|
|
|
|
|
|
public void Start() |
|
|
|
public void Start(object userstate) |
|
|
|
{ |
|
|
|
if (server.server == "") |
|
|
|
return; |
|
|
|
new Task(() => ICMPTest(0)).Start(); |
|
|
|
new Task(() => ICMPTest(0, userstate)).Start(); |
|
|
|
} |
|
|
|
|
|
|
|
private void ICMPTest(int delay) |
|
|
|
private void ICMPTest(int delay, object userstate) |
|
|
|
{ |
|
|
|
try |
|
|
|
{ |
|
|
@@ -351,7 +349,7 @@ namespace Shadowsocks.Controller |
|
|
|
repeat--; |
|
|
|
if (delay > 0) |
|
|
|
Thread.Sleep(delay); |
|
|
|
ping.SendAsync(ip, TimeoutMilliseconds, null); |
|
|
|
ping.SendAsync(ip, TimeoutMilliseconds, userstate); |
|
|
|
} |
|
|
|
catch (Exception e) |
|
|
|
{ |
|
|
@@ -374,7 +372,7 @@ namespace Shadowsocks.Controller |
|
|
|
Logging.Debug($"Ping {server.FriendlyName()} timeout"); |
|
|
|
RoundtripTime.Add(null); |
|
|
|
} |
|
|
|
TestNext(); |
|
|
|
TestNext(e.UserState); |
|
|
|
} |
|
|
|
catch (Exception ex) |
|
|
|
{ |
|
|
@@ -383,26 +381,30 @@ namespace Shadowsocks.Controller |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void TestNext() |
|
|
|
private void TestNext(object userstate) |
|
|
|
{ |
|
|
|
if (repeat > 0) |
|
|
|
{ |
|
|
|
//Do ICMPTest in a random frequency |
|
|
|
int delay = TimeoutMilliseconds + new Random().Next() % TimeoutMilliseconds; |
|
|
|
new Task(() => ICMPTest(delay)).Start(); |
|
|
|
new Task(() => ICMPTest(delay, userstate)).Start(); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
Completed?.Invoke(this, new CompletedEventArgs |
|
|
|
{ |
|
|
|
RoundtripTime = RoundtripTime |
|
|
|
Server = server, |
|
|
|
RoundtripTime = RoundtripTime, |
|
|
|
UserState = userstate |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public class CompletedEventArgs : EventArgs |
|
|
|
{ |
|
|
|
public Server Server; |
|
|
|
public List<int?> RoundtripTime; |
|
|
|
public object UserState; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|