From 752c0e0720b8a17cc4d20b64d54425beb7b8a568 Mon Sep 17 00:00:00 2001 From: Alex Macocian Date: Mon, 22 Jul 2019 14:23:50 +0300 Subject: [PATCH] Implemented debug logging. Fix high CPU usage caused by infinite loop. --- MTSC/Client/Client.cs | 19 +++++-- MTSC/Client/Handlers/BroadcastHandler.cs | 3 +- MTSC/Logging/ConsoleLogger.cs | 9 ++++ MTSC/Logging/DebugConsoleLogger.cs | 29 +++++++++++ MTSC/Logging/ILogger.cs | 6 +++ MTSC/Server/Handlers/BroadcastHandler.cs | 4 +- MTSC/Server/Handlers/HTTPHandler.cs | 65 ++++++++++++++++++++++++ MTSC/Server/Server.cs | 22 +++++++- 8 files changed, 149 insertions(+), 8 deletions(-) create mode 100644 MTSC/Logging/DebugConsoleLogger.cs create mode 100644 MTSC/Server/Handlers/HTTPHandler.cs diff --git a/MTSC/Client/Client.cs b/MTSC/Client/Client.cs index f158e87..9292935 100644 --- a/MTSC/Client/Client.cs +++ b/MTSC/Client/Client.cs @@ -62,7 +62,18 @@ namespace MTSC.Client { foreach (ILogger logger in loggers) { - logger.Log(log + "\n"); + logger.Log(log); + } + } + /// + /// Logs the debug message onto the associated loggers. + /// + /// + public void LogDebug(string debugMessage) + { + foreach (ILogger logger in loggers) + { + logger.LogDebug(debugMessage); } } /// @@ -195,7 +206,7 @@ namespace MTSC.Client * When a message has been received, process it. */ Message message = CommunicationPrimitives.GetMessage(tcpClient); - Log("Received a message of size: " + message.MessageLength); + LogDebug("Received a message of size: " + message.MessageLength); /* * Preprocess message. */ @@ -224,7 +235,9 @@ namespace MTSC.Client } catch(Exception e) { - foreach(IExceptionHandler exceptionHandler in exceptionHandlers) + LogDebug("Exception: " + e.Message); + LogDebug("Stacktrace: " + e.StackTrace); + foreach (IExceptionHandler exceptionHandler in exceptionHandlers) { exceptionHandler.HandleException(e); } diff --git a/MTSC/Client/Handlers/BroadcastHandler.cs b/MTSC/Client/Handlers/BroadcastHandler.cs index a11126a..cbf5040 100644 --- a/MTSC/Client/Handlers/BroadcastHandler.cs +++ b/MTSC/Client/Handlers/BroadcastHandler.cs @@ -34,7 +34,8 @@ namespace MTSC.Client.Handlers public bool HandleReceivedMessage(TcpClient client, Message message) { - managedClient.Log("Broadcast: " + ASCIIEncoding.ASCII.GetString(message.MessageBytes)); + managedClient.LogDebug("Broadcast: " + ASCIIEncoding.ASCII.GetString(message.MessageBytes)); + managedClient.Log(">" + ASCIIEncoding.ASCII.GetString(message.MessageBytes)); return false; } diff --git a/MTSC/Logging/ConsoleLogger.cs b/MTSC/Logging/ConsoleLogger.cs index 4d3d8ac..2a912bf 100644 --- a/MTSC/Logging/ConsoleLogger.cs +++ b/MTSC/Logging/ConsoleLogger.cs @@ -18,5 +18,14 @@ namespace MTSC.Logging Console.WriteLine(message); return false; } + /// + /// Ignores debug messages. + /// + /// + /// False + public bool LogDebug(string message) + { + return false; + } } } diff --git a/MTSC/Logging/DebugConsoleLogger.cs b/MTSC/Logging/DebugConsoleLogger.cs new file mode 100644 index 0000000..a6a4044 --- /dev/null +++ b/MTSC/Logging/DebugConsoleLogger.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MTSC.Logging +{ + public class DebugConsoleLogger : ILogger + { + /// + /// Ignores simple logging messages. + /// + /// + /// False + public bool Log(string message) + { + return false; + } + /// + /// Outputs the debug message to console. + /// + /// Message to be output. + /// False + public bool LogDebug(string message) + { + Console.WriteLine(message); + return false; + } + } +} diff --git a/MTSC/Logging/ILogger.cs b/MTSC/Logging/ILogger.cs index 961ca88..050a128 100644 --- a/MTSC/Logging/ILogger.cs +++ b/MTSC/Logging/ILogger.cs @@ -15,5 +15,11 @@ namespace MTSC.Logging /// Message to be received. /// True if the message has been logged and no other logger should log this message. bool Log(string message); + /// + /// Logs the received debug message. + /// + /// Debug message to be logged. + /// True if the message has been logged and no other logger should log this message. + bool LogDebug(string message); } } diff --git a/MTSC/Server/Handlers/BroadcastHandler.cs b/MTSC/Server/Handlers/BroadcastHandler.cs index 732b195..9bd1187 100644 --- a/MTSC/Server/Handlers/BroadcastHandler.cs +++ b/MTSC/Server/Handlers/BroadcastHandler.cs @@ -28,8 +28,8 @@ namespace MTSC.Server.Handlers public bool HandleReceivedMessage(ClientStruct client, Message message) { - managedServer.Log("Broadcast: " + ASCIIEncoding.ASCII.GetString(message.MessageBytes)); - managedServer.Log("From: " + client.TcpClient.Client.RemoteEndPoint.ToString()); + managedServer.LogDebug("Broadcast: " + ASCIIEncoding.ASCII.GetString(message.MessageBytes)); + managedServer.LogDebug("From: " + client.TcpClient.Client.RemoteEndPoint.ToString()); foreach(ClientStruct clientStruct in managedServer.Clients) { managedServer.QueueMessage(clientStruct, message.MessageBytes); diff --git a/MTSC/Server/Handlers/HTTPHandler.cs b/MTSC/Server/Handlers/HTTPHandler.cs new file mode 100644 index 0000000..6859617 --- /dev/null +++ b/MTSC/Server/Handlers/HTTPHandler.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MTSC.Server.Handlers +{ + class HTTPHandler + { + public enum Methods + { + OPTIONS, + GET, + HEAD, + POST, + PUT, + DELETE, + TRACE, + CONNECT, + extension_method + } + public enum StatusCode + { + Continue = 100, + SwitchingProtocols = 101, + OK = 200, + Created = 201, + Accepted = 202, + NonAuthoritativeInformation = 203, + NoContent = 204, + ResetContent = 205, + PartialContent = 206, + MultipleChoices = 300, + MovedPermanently = 301, + Found = 302, + SeeOther = 303, + NotModified = 304, + UseProxy = 305, + TemporaryRedirect = 307, + BadRequest = 400, + Unauthorized = 401, + PaymentRequired = 402, + Forbidden = 403, + NotFound = 404, + MethodNotAllowed = 405, + NotAcceptable = 406, + ProxyAuthenticationRequired = 407, + RequestTimeout = 408, + Conflict = 409, + Gone = 410, + LengthRequired = 411, + PreconditionFailed = 412, + RequestEntityTooLarge = 413, + RequestURITooLarge = 414, + UnsupportedMediaType = 415, + RequestRangeNotSatisfiable = 416, + ExpectationFailed = 417, + InternalServerError = 500, + NotImplemented = 501, + BadGateway = 502, + ServiceUnavailable = 503, + GatewayTimeout = 504, + HttpVersionNotSupported = 505 + } + } +} diff --git a/MTSC/Server/Server.cs b/MTSC/Server/Server.cs index 2af9e0b..5fbeb2b 100644 --- a/MTSC/Server/Server.cs +++ b/MTSC/Server/Server.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace MTSC.Server @@ -115,7 +116,18 @@ namespace MTSC.Server { foreach (ILogger logger in loggers) { - logger.Log(log + "\n"); + logger.Log(log); + } + } + /// + /// Adds a debug message to be logged by the associated loggers. + /// + /// Debug message to be logged + public void LogDebug(string debugMessage) + { + foreach (ILogger logger in loggers) + { + logger.LogDebug(debugMessage); } } /// @@ -173,7 +185,7 @@ namespace MTSC.Server if (client.TcpClient.Available > 0) { Message message = CommunicationPrimitives.GetMessage(client.TcpClient); - Log("Received message from " + client.TcpClient.Client.RemoteEndPoint.ToString() + + LogDebug("Received message from " + client.TcpClient.Client.RemoteEndPoint.ToString() + "\nMessage length: " + message.MessageLength); foreach (IHandler handler in handlers) { @@ -190,9 +202,15 @@ namespace MTSC.Server } } } + else + { + Thread.Sleep(100); + } } catch(Exception e) { + LogDebug("Exception: " + e.Message); + LogDebug("Stacktrace: " + e.StackTrace); foreach(IExceptionHandler exceptionHandler in exceptionHandlers) { if (exceptionHandler.HandleException(e))