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