// 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();
        }
Example #2
0
        // process requests from VSCode
        void ICDPListener.X_FromVSCode(string command, int seq, dynamic args, string reqText)
        {
            lock (this) {
                //MessageBox.OK(reqText);
                if (args == null)
                {
                    args = new { };
                }

                try {
                    switch (command)
                    {
                    case "initialize":
                        Initialize(command, seq, args);
                        break;

                    case "launch":
                        Launch(command, seq, args);
                        break;

                    case "attach":
                        Attach(command, seq, args);
                        break;

                    case "disconnect":
                        Disconnect(command, seq, args);
                        break;

                    case "next":
                    case "continue":
                    case "stepIn":
                    case "stepOut":
                    case "stackTrace":
                    case "scopes":
                    case "variables":
                    case "threads":
                    case "setBreakpoints":
                    case "configurationDone":
                    case "evaluate":
                    case "pause":
                        FindAndSendToDebuggee(reqText);
                        break;

                    case "source":
                        SendErrorResponse(command, seq, 1020, "command not supported: " + command);
                        break;

                    default:
                        SendErrorResponse(command, seq, 1014, "unrecognized request: {_request}", new { _request = command });
                        break;
                    }
                } catch (Exception e) {
                    Utilities.LogMessageToFile("Exception in X_FromVSCode: " + e);
                    MessageBox.WTF(e.ToString());
                    SendErrorResponse(command, seq, 1104, "error while processing request '{_request}' (exception: {_exception})", new { _request = command, _exception = e.Message });
                    Environment.Exit(1);
                }
            }
        }
        public void SendToDebuggee(string reqText)
        {
            if (debuglogProtocol)
            {
                Utilities.LogMessageToFile(" > " + reqText);
            }
            byte[] bodyBytes = encoding.GetBytes(reqText);
            string header    = '#' + bodyBytes.Length.ToString() + "\n";

            byte[] headerBytes = encoding.GetBytes(header);
            try {
                networkStream.Write(headerBytes, 0, headerBytes.Length);
                networkStream.Write(bodyBytes, 0, bodyBytes.Length);
            } catch (IOException) {
                Disconnect();
            }
        }
Example #4
0
 private void FindAndSendToDebuggee(string jsonText)
 {
     // ok, figure out to what debuggee this should go
     try {
         var j = JsonConvert.DeserializeObject <Request>(jsonText);
         if (j.arguments != null)
         {
             var threadIdTmp = j.arguments.Property("threadId");
             if (threadIdTmp != null)
             {
                 string threadId = (string)threadIdTmp;
                 debuggeeThreads[threadId].SendToDebuggee(jsonText);
                 return;
             }
         }
     } catch (Exception e) {
         Utilities.LogMessageToFile("Exception in FindAndSendToDebuggee: " + e);
     }
     //Utilities.LogMessageToFile("[[Broadcast]]");
     sendToEveryone(jsonText);
 }
        bool ProcessData(ref ByteBuffer recvBuffer)
        {
            string s         = recvBuffer.GetString(encoding);
            int    headerEnd = s.IndexOf('\n');

            if (headerEnd < 0)
            {
                return(false);
            }

            string header = s.Substring(0, headerEnd);

            if (header[0] != '#')
            {
                throw new Exception("Broken header:" + header);
            }
            var bodySize = int.Parse(header.Substring(1));

            // Because the headers are all 0 - 127 ASCII characters only
                        // The results are the same when calculated as string length and as number of bytes.
            if (recvBuffer.Length < headerEnd + 1 + bodySize)
            {
                return(false);
            }

            recvBuffer.RemoveFirst(headerEnd + 1);
            byte[] bodyBytes = recvBuffer.RemoveFirst(bodySize);

            string body = encoding.GetString(bodyBytes);

            //MessageBox.OK(body);

            if (debuglogProtocol)
            {
                Utilities.LogMessageToFile(" < " + body);
            }
            debuggeeListener.VSDebuggeeMessage(this, bodyBytes);
            return(true);
        }