public static Socks5Response FromRequest(Socks5Request request, byte response, bool resolveRemote) { var resp = new Socks5Response { Version = request.Version, Response = response, RSV = request.RSV, Remote = resolveRemote? request.Remote.Resolve() : request.Remote }; return(resp); }
public static Socks5Response FromRequest(Socks5Request request, IPEndPoint bindedEndPoint) { var resp = new Socks5Response { Version = request.Version, Response = SocksResponse.SUCCESS, RSV = request.RSV, Remote = new SocksRemote() { AddressType = bindedEndPoint.AddressFamily == AddressFamily.InterNetworkV6 ? SocksAddressType.IPV6 : SocksAddressType.IPV4, Address = AddressUtils.GetVaildLocalIpAddress(bindedEndPoint), Port = (ushort)bindedEndPoint.Port, } }; return(resp); }
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); }