123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- using System.Collections.Generic;
- using System.IO;
- using System.Net;
- using System.Text;
- using TftpServer.Utils;
- namespace TftpServer
- {
- public class TftpPacket
- {
- public TftpOpCode OpCode { get; set; }
- public string FileName { get; set; }
- public string Mode { get; set; }
- public short BlockNumber { get; set; }
- public byte[] Data { get; set; }
- public short ErrorNumber { get; set; }
- public string ErrorMessage { get; set; }
- public Dictionary<string, byte> Options { get; set; }
- public TftpPacket(byte[] buffer, int length)
- {
- using var stream = new MemoryStream(buffer);
- using var reader = new BinaryReader(stream);
- OpCode = (TftpOpCode)IPAddress.NetworkToHostOrder(reader.ReadInt16());
- switch (OpCode)
- {
- default: throw new InvalidDataException($"Unknown OpCode: {OpCode} (0x{OpCode:X4})");
- case TftpOpCode.Read:
- var len = buffer.ScanNullTerminated(stream.Position);
- FileName = Encoding.ASCII.GetString(buffer, (int)stream.Position, len);
- stream.Position += len;
- len = buffer.ScanNullTerminated(stream.Position);
- Mode = Encoding.ASCII.GetString(buffer, (int)stream.Position, len);
- stream.Position += len;
- break;
- case TftpOpCode.Ack:
- BlockNumber = IPAddress.NetworkToHostOrder(reader.ReadInt16());
- break;
- }
- }
- }
- }
|