private void ReceiveThreadEntry()
        {
            try
            {
                while (this.running)
                {
                    if (serverCred == null)
                    {
                        serverCred = Credential.Current();

                        ContextDebugger.WriteLine("[Server] Creating Server Cred");
                    }

                    var request = new ServiceRequest(serverCred, this.serverSocket.Accept(), cancel.Token)
                    {
                        OnReceived = OnReceived
                    };

                    ThreadPool.QueueUserWorkItem(request.Process);
                }
            }
            catch (Exception e)
            {
                OnException(e);
            }
            finally
            {
                this.running = false;

                ContextDebugger.WriteLine("STOPPED");

                this.Stopped?.Invoke();
            }
        }
        public Client(string host, int port = DefaultPort, Credential clientCred = null)
        {
            if (port <= 0)
            {
                port = DefaultPort;
            }

            this.host = host.Trim();
            this.port = port;
            this.spn  = $"host/{host}";

            ContextDebugger.WriteLine($"[Client] SPN {spn}");

            this.cred = clientCred ?? Credential.Current();

            this.context = new Shared.SecurityContext(cred, "Negotiate");
        }