public async Task Connect() { _status = ProxySessionStatus.Booting; _forwardClient = new TcpClient(); try { await _forwardClient.ConnectAsync(_forwardEndPoint.Address, _forwardEndPoint.Port); } catch { await Disconnect(); return; } _ = Task.Run(async() => { try { _status = ProxySessionStatus.Running; var fromSourceStream = _client.GetStream(); var toTargetStream = _forwardClient.GetStream(); // 連線對接 await Task.WhenAny( fromSourceStream.CopyToAsync(toTargetStream), toTargetStream.CopyToAsync(fromSourceStream)); } catch { await Disconnect(); return; } await Disconnect(); }); OnConnected?.Invoke(this); }
public async Task Disconnect() { _status = ProxySessionStatus.Closing; try { _client.Close(); _client.Dispose(); } catch { } try { _forwardClient.Close(); _forwardClient.Close(); } catch { } _status = ProxySessionStatus.Shutdown; OnDisconnected?.Invoke(this); }