using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; using TftpServer.Utils; namespace TftpServer { internal class TftpProgram { private static bool _isRunning; private static string Root; private static void Main(string[] args) { Console.WriteLine("Starting..."); Root = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Properties.Settings.Default.Root); var tWorker = new Thread(Working); _isRunning = true; tWorker.Start(); Console.WriteLine("Press ENTER to Stop."); Console.ReadLine(); Console.Write("Shutting down..."); _isRunning = false; tWorker.Join(); Console.Write("Stopped."); Console.WriteLine(); Console.Write("Press ENTER to Exit."); Console.ReadLine(); } private static void Working() { var listenEndPoint = new IPEndPoint(IPAddress.Parse(Properties.Settings.Default.ListenOn), 69); var socket = new Socket(listenEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp) { SendBufferSize = 65536, ReceiveBufferSize = 65536 }; socket.Bind(listenEndPoint); var upTime = DateTime.Now; Console.WriteLine($"TFTP Server started, listing on: {listenEndPoint}"); var buffer = new byte[65536]; EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 68); var polling = DateTime.Now; while (_isRunning) { Console.CursorLeft = 0; if (false == socket.Poll(500 * 1000, SelectMode.SelectRead)) { var timeSpan = DateTime.Now - polling; var up = DateTime.Now - upTime; Console.Write($"Polling..." + $" {timeSpan.Days:00}D {timeSpan.Hours:00}H {timeSpan.Minutes:00}M {timeSpan.Seconds:00}S {timeSpan.Milliseconds:000}" + $" / UP {up.Days:00}D {up.Hours:00}H {up.Minutes:00}M {up.Seconds:00}S {up.Milliseconds:000}"); } else { polling = DateTime.Now; Console.WriteLine(); var bytes = socket.ReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEndPoint); Console.Write($"Receive {bytes} byte From {remoteEndPoint}"); try { var packet = new TftpPacket(buffer, bytes); switch (packet.OpCode) { default: break; } } catch (Exception e) { Console.WriteLine(e); } Console.WriteLine(); } } } } }