private async Task <HostData> ProcessRequest() { _request = await ReadRequest(); if (_request.Command == SocksCommand.CONNECT) { _target = new HostData() { Address = _request.Remote.Address, Port = _request.Remote.Port }; Logger.LogInformation($"Connecting to {_target}, {Id}"); return(_target); } else if (_request.Command == SocksCommand.UDP) { Logger.LogInformation($"Configing udp relay, {Id}"); _target = new HostData() { Address = _request.Remote.Address, Port = _request.Remote.Port, Type = RemoteType.Udp }; BindUdp(_target); return(_target); } var resp = Socks5Response.FromRequest(_request, SocksResponse.CANNOT_CONNECT, _supportPrivoxy); var data = resp.ToBytes(); await WriteAsync(data); await FlushAsync(); _pipe.Reader.Complete(); throw new SocksException("Command not supported"); }
public override async Task <bool> ProcessSharkData(BlockData block) { if (block.Type == BlockType.CONNECTED) { Socks5Response resp; if (_target.Type == RemoteType.Tcp) { resp = Socks5Response.FromRequest(_request, SocksResponse.SUCCESS, _supportPrivoxy); var data = resp.ToBytes(); await WriteAsync(data); await FlushAsync(); Logger.LogInformation($"{_target} connected, {Id}"); #pragma warning disable CS4014 ProcessData(); #pragma warning restore CS4014 } else if (_target.Type == RemoteType.Udp) { resp = Socks5Response.FromRequest(_request, _udp.Client.LocalEndPoint as IPEndPoint); var data = resp.ToBytes(); await WriteAsync(data); StopTcp(); _pipe.Reader.Complete(); Logger.LogInformation($"Udp relay started, {Id}"); } } else if (block.Type == BlockType.CONNECT_FAILED) { var resp = Socks5Response.FromRequest(_request, SocksResponse.CANNOT_CONNECT, _supportPrivoxy); var data = resp.ToBytes(); await WriteAsync(data); await FlushAsync(); _pipe.Reader.Complete(); Logger.LogWarning($"Connect to {_target} failed, {Id}"); return(false); } else if (block.Type == BlockType.DATA) { if (_target.IsUdp) { block.Data.CopyTo(new Memory <byte>(_udpBuffer, 3, block.Data.Length)); _udpBuffer[0] = _udpBuffer[1] = _udpBuffer[2] = 0; await _udp.SendAsync(_udpBuffer, block.Data.Length + 3, _lastEndpoint); } else { await WriteAsync(block.Data); await FlushAsync(); } } return(!_socksFailed); }