public static byte[] CreateAnswer(DnsAnswer answer, int position, Dictionary <string, int> cache) { var result = new List <byte>(); var encodedDomain = EncodeDomain(answer.Name, position, cache, false); result.AddRange(encodedDomain); var type = (short)answer.AnswerType; var typeBytes = BitConverter.GetBytes(type); Array.Reverse(typeBytes); result.AddRange(typeBytes); var classValue = (short)answer.Class; var classBytes = BitConverter.GetBytes(classValue); Array.Reverse(classBytes); result.AddRange(classBytes); var ttlBytes = BitConverter.GetBytes(answer.TTL); Array.Reverse(ttlBytes); result.AddRange(ttlBytes); byte[] dataBytes; if (answer.AnswerType == AnswerType.A) { dataBytes = IPAddress.Parse(answer.Data).GetAddressBytes(); } else if (answer.AnswerType == AnswerType.NS) { dataBytes = EncodeDomain(answer.Data, position + result.Count, cache, true); } else { dataBytes = new byte[0]; } var length = (ushort)dataBytes.Length; var lengthBytes = BitConverter.GetBytes(length); Array.Reverse(lengthBytes); result.AddRange(lengthBytes); result.AddRange(dataBytes); return(result.ToArray()); }
private static DnsAnswer ParseAnswer(BinaryReader reader, byte[] packet, int position, Dictionary <int, byte[]> nameCache) { var(domain, shift) = ParseDomain(packet, position, nameCache); var _ = reader.BaseStream.Seek(shift, SeekOrigin.Begin); var type = (AnswerType)reader.ReadUInt16(); var queryClass = (Class)reader.ReadUInt16(); var ttl = reader.ReadUInt32(); var dataLength = reader.ReadUInt16(); var data = ""; if (type == AnswerType.A) { var dataArray = new List <byte>(); for (var i = 0; i < dataLength; i++) { dataArray.Add(reader.ReadByte()); } data = string.Join(".", dataArray.Select(item => item.ToString())); } else if (type == AnswerType.NS) { var(name, nsShift) = ParseDomain(packet, (int)reader.BaseStream.Position, nameCache); var __ = reader.BaseStream.Seek(nsShift, SeekOrigin.Begin); data = name; } else if (type == AnswerType.SOA) { data = ""; } var answer = new DnsAnswer { Class = queryClass, AnswerType = type, Name = domain, TTL = ttl, Data = data }; return(answer); }