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