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