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);
        }