You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
3.6 KiB

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}");
}
}
}
}