private async Task RunService(IStreamService svc, SocketConnection conn, IPEndPoint localEP, DnsEndPoint remoteEP, string method, string?password, byte[]?key) { var s5tcp = new PipePair(); var raw = await svc.Handle(conn); ShadowsocksClient s5c; if (!string.IsNullOrEmpty(password)) { s5c = new ShadowsocksClient(method, password); } else if (key != null) { s5c = new ShadowsocksClient(method, key); } else { throw new ArgumentException("Either a password or a key must be provided."); } var tpc = new TcpPipeClient(); var t2 = tpc.Connect(remoteEP, s5tcp.DownSide, null); var t1 = s5c.Connect(localEP, raw, s5tcp.UpSide); await Task.WhenAll(t1, t2); }