TftpPacket.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Net;
  4. using System.Text;
  5. using TftpServer.Utils;
  6. namespace TftpServer
  7. {
  8. public class TftpPacket
  9. {
  10. public TftpOpCode OpCode { get; set; }
  11. public string FileName { get; set; }
  12. public string Mode { get; set; }
  13. public short BlockNumber { get; set; }
  14. public byte[] Data { get; set; }
  15. public short ErrorNumber { get; set; }
  16. public string ErrorMessage { get; set; }
  17. public Dictionary<string, byte> Options { get; set; }
  18. public TftpPacket(byte[] buffer, int length)
  19. {
  20. using var stream = new MemoryStream(buffer);
  21. using var reader = new BinaryReader(stream);
  22. OpCode = (TftpOpCode)IPAddress.NetworkToHostOrder(reader.ReadInt16());
  23. switch (OpCode)
  24. {
  25. default: throw new InvalidDataException($"Unknown OpCode: {OpCode} (0x{OpCode:X4})");
  26. case TftpOpCode.Read:
  27. var len = buffer.ScanNullTerminated(stream.Position);
  28. FileName = Encoding.ASCII.GetString(buffer, (int)stream.Position, len);
  29. stream.Position += len;
  30. len = buffer.ScanNullTerminated(stream.Position);
  31. Mode = Encoding.ASCII.GetString(buffer, (int)stream.Position, len);
  32. stream.Position += len;
  33. break;
  34. case TftpOpCode.Ack:
  35. BlockNumber = IPAddress.NetworkToHostOrder(reader.ReadInt16());
  36. break;
  37. }
  38. }
  39. }
  40. }