private void HandleAsyncCallback(IAsyncResult ar)
        {
            if (ar.IsCompleted == false)
            {
                return;
            }

            TcpListener listener = (TcpListener)ar.AsyncState;

            var client = listener.EndAcceptTcpClient(ar);

            Console.WriteLine("TcpClient connected from " + client.Client.RemoteEndPoint);

            var wr_client = new WrappedTcpClient(client);

            wr_client.OnDidReadBytes += (theClient, data) =>
            {
                OnDidReadBytes?.Invoke(theClient, data);
            };
            lock (lockObj)
            {
                clients.Add(wr_client);
            }
            wr_client.Start();

            tcpListener.BeginAcceptTcpClient(HandleAsyncCallback, tcpListener);
        }
        private void HandleAsyncCallback(IAsyncResult ar)
        {
            int didRead = stream.EndRead(ar);

            if (didRead == 0)
            {
                Console.WriteLine("Did read 0 bytes");

                stream = null;

                client?.Close();
                client = null;

                return;
            }

            Span <byte> span = new Span <byte>(buffer, 0, didRead);

            OnDidReadBytes?.Invoke(this, span);
            span = null;

            stream.BeginRead(buffer, 0, buffer.Length, HandleAsyncCallback, null);
        }