public async Task Start(CancellationToken token, ConsoleRunnerDataReceived outputCallback) { outputCallback(this, "started"); while (!token.IsCancellationRequested) { if (Baypass()) { outputCallback(this, "bypass"); try { await Task.Delay(_verifyInterval, token); } catch (TaskCanceledException ex) { } continue; } outputCallback(this, "ping"); if (!await Ping()) { _connected = false; outputCallback(this, "start reconnecting"); var reconnectingResult = await Reconnect(); if (reconnectingResult) { outputCallback(this, "reconnected success"); } else { outputCallback(this, "disconnected state"); } } else { _connected = true; } if (token.IsCancellationRequested) { break; } outputCallback(this, "wait"); try { await Task.Delay(_verifyInterval, token); } catch (TaskCanceledException ex) { } } outputCallback(this, "stopped"); }
public ConnectManager(ConnectManagerConfig config, ConsoleRunnerDataReceived outputCallback) { _runner = new AsyncConsoleRunner(); _runner.OnConsoleRunnerDataReceived += (s, p) => outputCallback(this, p); _runner.OnConsoleRunnerErrorDataReceived += (s, p) => outputCallback(this, p); _ping = new Ping(); _address = config.PingAddress; _clientPath = config.VpnClientPath; _connectCommand = $" connect \"{config.VpnProfileName}\""; _disconnectCommand = $" disconnect"; _delay = config.ReconnectDelay; _verifyInterval = config.VerifyPeriod; _connected = false; _enabledBypass = config.EnableBypassTime; _bypassFrom = config.BypassFrom; _bypassTo = config.BypassTo; }