// this is a multi-threaded TCP listener.
        // it accepts all connections as fast as possible and puts the session handling into a new thread

        public static void StartListener(IDebuggeeListener listener, dynamic args)
        {
            TcpListener serverSocket = new TcpListener((bool)args.listenPublicly ? IPAddress.Any : IPAddress.Parse("127.0.0.1"), (int)args.listenPort);

            serverSocket.Start();
            // run main accepting loop also in a thread
            new System.Threading.Thread(() => {
                while (true)
                {
                    var clientSocket = serverSocket.AcceptSocket();
                    // we got a new client, create a new thread for it :)
                    if (clientSocket != null)
                    {
                        //Utilities.LogMessageToFile(">> accepted connection from client");

                        new System.Threading.Thread(() => {
                            using (var networkStream = new NetworkStream(clientSocket)) {
                                try {
                                    DebuggeeSession d = new DebuggeeSession(listener, networkStream);
                                    d.RunSession();
                                } catch (Exception e) {
                                    Utilities.LogMessageToFile("Exception: " + e);
                                }
                            }
                            clientSocket.Close();
                            //Utilities.LogMessageToFile(">> client connection closed");
                        }).Start();
                    }
                }
            }).Start();
        }
 public DebuggeeProtocol(
     IDebuggeeListener debuggeeListener,
     TcpListener tcpListener,
     Encoding encoding)
 {
     this.debuggeeListener = debuggeeListener;
     this.tcpListener      = tcpListener;
     this.encoding         = encoding;
 }
        const bool debuglogProtocol = false; // set this to true if you want to read in the logfile what data is exchanged

        public DebuggeeSession(IDebuggeeListener debuggeeListener, NetworkStream networkStream)
        {
            this.debuggeeListener = debuggeeListener;
            this.networkStream    = networkStream;
        }