Example #1
0
        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);
        }
Example #2
0
        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);
        }