public static byte[] CreatePacket(DnsPacket packet) { var result = new List <byte>(); var queryBytes = BitConverter.GetBytes(packet.QueryId); Array.Reverse(queryBytes); result.AddRange(queryBytes); var flags = DnsFlags.CreateFlags(packet.Flags); var flagsByte = BitConverter.GetBytes(flags); Array.Reverse(flagsByte); result.AddRange(flagsByte); var questionsCount = BitConverter.GetBytes((short)packet.Queries.Count); Array.Reverse(questionsCount); result.AddRange(questionsCount); var answersCount = BitConverter.GetBytes((short)packet.Answers.Count); Array.Reverse(answersCount); result.AddRange(answersCount); var authoritativeCount = BitConverter.GetBytes((short)packet.AuthorityAnswers.Count); Array.Reverse(authoritativeCount); result.AddRange(authoritativeCount); var additionalCount = BitConverter.GetBytes((short)packet.AdditionalAnswers.Count); Array.Reverse(additionalCount); result.AddRange(additionalCount); var nameCache = new Dictionary <string, int>(); foreach (var query in packet.Queries) { result.AddRange(CreateQuery(query, result.Count, nameCache)); } foreach (var answer in packet.Answers) { result.AddRange(CreateAnswer(answer, result.Count, nameCache)); } foreach (var answer in packet.AuthorityAnswers) { result.AddRange(CreateAnswer(answer, result.Count, nameCache)); } foreach (var answer in packet.AdditionalAnswers) { result.AddRange(CreateAnswer(answer, result.Count, nameCache)); } return(result.ToArray()); }
public static DnsPacket ParsePacket(byte[] packet) { using (var stream = new MemoryStream(packet)) { using (var reader = new BigEndianBinaryReader(stream, Encoding.BigEndianUnicode)) { var id = reader.ReadUInt16(); var flagsByte = reader.ReadUInt16(); var flags = DnsFlags.ParseFlags(flagsByte); var questionsCount = reader.ReadUInt16(); var answersCount = reader.ReadUInt16(); var authorityAnswersCount = reader.ReadUInt16(); var additionalAnswersCount = reader.ReadUInt16(); var nameCache = new Dictionary <int, byte[]>(); var questions = new List <DnsQuery>(); var answers = new List <DnsAnswer>(); var additionalAnswers = new List <DnsAnswer>(); var authoritativeAnswers = new List <DnsAnswer>(); for (var i = 0; i < questionsCount; i++) { questions.Add(ParseQuery(reader, packet, (int)reader.BaseStream.Position, nameCache)); } for (var i = 0; i < answersCount; i++) { answers.Add(ParseAnswer(reader, packet, (int)reader.BaseStream.Position, nameCache)); } for (var i = 0; i < authorityAnswersCount; i++) { authoritativeAnswers.Add( ParseAnswer(reader, packet, (int)reader.BaseStream.Position, nameCache)); } for (var i = 0; i < additionalAnswersCount; i++) { additionalAnswers.Add(ParseAnswer(reader, packet, (int)reader.BaseStream.Position, nameCache)); } var result = new DnsPacket { QueryId = id, Flags = flags, Queries = questions, Answers = answers, AuthorityAnswers = authoritativeAnswers, AdditionalAnswers = additionalAnswers }; return(result); } } }
public static DnsPacket CreateSimpleErrorPacket(DnsQuery query, ushort queryId, byte replyCode) { var flags = new DnsFlags { RecursionDesired = true, RecursionAvailable = true, ReplyCode = replyCode }; var packet = new DnsPacket { QueryId = queryId, Flags = flags, Queries = new List <DnsQuery> { query }, Answers = new List <DnsAnswer>(), AdditionalAnswers = new List <DnsAnswer>(), AuthorityAnswers = new List <DnsAnswer>() }; return(packet); }
private void PutAsnwersInCache(DnsPacket packet) { AnswersCache.PutAnswers(packet.Answers); AnswersCache.PutAnswers(packet.AuthorityAnswers); AnswersCache.PutAnswers(packet.AdditionalAnswers); }