|
|
|
|
@ -0,0 +1,112 @@ |
|
|
|
|
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}"; |
|
|
|
|
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}"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |