using System.Net; using System.Net.Sockets; using System.Text; namespace TcpTestApp; internal class Program { private static Thread? serverThread; private static CancellationTokenSource? cts; private static TcpListener? listener; public static bool applicationQuitRequested { get; private set; } static void Main(string[] args) { while (applicationQuitRequested == false) { Console.WriteLine($"----- TCP Server for Protocol Testing -----"); Console.WriteLine($"Command list:"); Console.WriteLine($"s = start server"); Console.WriteLine($"e = stop server"); Console.WriteLine($"q = quit"); var key = Console.ReadKey(true); switch (key.Key) { // start server case ConsoleKey.S: Console.Write($"Write port number to listen on: "); string? portString = Console.ReadLine(); int port; if (portString == null || portString == "" || Int32.TryParse(portString, out port) == false) { Console.WriteLine($"Invalid port entered."); break; } var ipEndPoint = new IPEndPoint(IPAddress.Any, port); listener = new(ipEndPoint); try { listener.Start(); } catch (Exception ex) { Console.WriteLine($"Could not start TCP server. \n {ex}"); break; } cts = new CancellationTokenSource(); // reset token serverThread = new Thread(() => HandleTcp(cts)); serverThread.Start(); Console.WriteLine("Started TCP server."); break; // stop server case ConsoleKey.E: cts?.Cancel(); serverThread?.Join(); serverThread = null; listener?.Stop(); Console.WriteLine("Stopped TCP server."); break; // quit case ConsoleKey.Q: applicationQuitRequested = true; break; default: Console.WriteLine($"{Environment.NewLine}Did not recognize key.. {Environment.NewLine}"); break; } } } static async void HandleTcp(CancellationTokenSource cts) { while (!cts.IsCancellationRequested) { try { using TcpClient handler = await listener!.AcceptTcpClientAsync(cts.Token); if(handler != null) { Console.WriteLine($"Accepted connection from client {handler.Client.RemoteEndPoint}"); await using NetworkStream stream = handler.GetStream(); var message = $"Welcome to the test TCP server.\n Current Time: {DateTime.Now}\n"; var dateTimeBytes = Encoding.UTF8.GetBytes(message); await stream.WriteAsync(dateTimeBytes); Console.WriteLine($"Sent message to client: \"{message}\""); } } catch(Exception ex) { listener?.Stop(); Console.WriteLine($"Listener was stopped because of exception: {ex}"); } } } }