TftpProgram.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.IO;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Threading;
  6. using TftpServer.Utils;
  7. namespace TftpServer
  8. {
  9. internal class TftpProgram
  10. {
  11. private static bool _isRunning;
  12. private static string Root;
  13. private static void Main(string[] args)
  14. {
  15. Console.WriteLine("Starting...");
  16. Root = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Properties.Settings.Default.Root);
  17. var tWorker = new Thread(Working);
  18. _isRunning = true;
  19. tWorker.Start();
  20. Console.WriteLine("Press ENTER to Stop.");
  21. Console.ReadLine();
  22. Console.Write("Shutting down...");
  23. _isRunning = false;
  24. tWorker.Join();
  25. Console.Write("Stopped.");
  26. Console.WriteLine();
  27. Console.Write("Press ENTER to Exit.");
  28. Console.ReadLine();
  29. }
  30. private static void Working()
  31. {
  32. var listenEndPoint = new IPEndPoint(IPAddress.Parse(Properties.Settings.Default.ListenOn), 69);
  33. var socket = new Socket(listenEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp)
  34. {
  35. SendBufferSize = 65536,
  36. ReceiveBufferSize = 65536
  37. };
  38. socket.Bind(listenEndPoint);
  39. var upTime = DateTime.Now;
  40. Console.WriteLine($"TFTP Server started, listing on: {listenEndPoint}");
  41. var buffer = new byte[65536];
  42. EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 68);
  43. var polling = DateTime.Now;
  44. while (_isRunning)
  45. {
  46. Console.CursorLeft = 0;
  47. if (false == socket.Poll(500 * 1000, SelectMode.SelectRead))
  48. {
  49. var timeSpan = DateTime.Now - polling;
  50. var up = DateTime.Now - upTime;
  51. Console.Write($"Polling..." +
  52. $" {timeSpan.Days:00}D {timeSpan.Hours:00}H {timeSpan.Minutes:00}M {timeSpan.Seconds:00}S {timeSpan.Milliseconds:000}" +
  53. $" / UP {up.Days:00}D {up.Hours:00}H {up.Minutes:00}M {up.Seconds:00}S {up.Milliseconds:000}");
  54. }
  55. else
  56. {
  57. polling = DateTime.Now;
  58. Console.WriteLine();
  59. var bytes = socket.ReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEndPoint);
  60. Console.Write($"Receive {bytes} byte From {remoteEndPoint}");
  61. try
  62. {
  63. var packet = new TftpPacket(buffer, bytes);
  64. switch (packet.OpCode)
  65. {
  66. default:
  67. break;
  68. }
  69. }
  70. catch (Exception e)
  71. {
  72. Console.WriteLine(e);
  73. }
  74. Console.WriteLine();
  75. }
  76. }
  77. }
  78. }
  79. }