static public c**t Parse(byte[] onlyReplyCode) { ReplyCodeBuilder replyCode = new ReplyCodeBuilder(); replyCode.isQuery = (onlyReplyCode[2] & 1) == 1; replyCode.authoritativeAnswer = (onlyReplyCode[2] & 16) == 16; replyCode.truncation = (onlyReplyCode[2] & 32) == 32; replyCode.recursionDesired = (onlyReplyCode[2] & 64) == 64; replyCode.recursionAvailable = (onlyReplyCode[2] & 128) == 128; replyCode.opCode = (Opcode)(onlyReplyCode[2] & 14); replyCode.responseCode = (ResponseCodes)(onlyReplyCode[3] & 240); replyCode.questions = (ushort)((onlyReplyCode[4] << 8) | onlyReplyCode[5]); replyCode.answers = (ushort)((onlyReplyCode[6] << 8) | onlyReplyCode[7]); replyCode.authorities = (ushort)((onlyReplyCode[8] << 8) | onlyReplyCode[9]); replyCode.additional = (ushort)((onlyReplyCode[10] << 8) | onlyReplyCode[11]); return(new c**t(replyCode)); }
static void Benchmark(int repetitions) { Domain domain = new Domain("org"); var thing = domain.AddSubdomain(new Domain("iansweb")); thing.AddSubdomain(new Domain("forum")).A_Records.Add(new DNS.Messages.Records.A(new byte[] { 127, 0, 0, 1 })); thing.A_Records.Add(new DNS.Messages.Records.A(new byte[] { 127, 0, 0, 1 })); var now = DateTime.Now; for (int i = 0; i < repetitions; i++) { var parsed = Parser.Parse(ahh); //var ans = record.GetAnswer(parsed.Questions[0]); List <Answer> answers = new List <Answer>(); foreach (var question in parsed.Questions) { var ams = domain.RetrieveSubDomain(question.RawBytes); Answer[] answerss = new Answer[0]; if (ams != null) { answerss = ams.GetAnswers(question); } if (ams == null) { Console.WriteLine($"{question.Raw} {question.Type} {question.Class} -> Name not found"); } else { if (answerss.Length < 1) { Console.WriteLine($"{question.Raw} {question.Type} {question.Class} -> No records found"); } else { Console.WriteLine($"{question.Raw} {question.Type} {question.Class} -> {ams.FQDN}"); foreach (var a in answerss) { Console.WriteLine($"\t{a.StringFQDN} -> {a.a}"); } } } } ReplyCodeBuilder replyCodeBuilder = new ReplyCodeBuilder(); replyCodeBuilder.answers = (ushort)answers.Count; replyCodeBuilder.questions = parsed.QuestionCount; replyCodeBuilder.isQuery = false; replyCodeBuilder.recursionAvailable = false; replyCodeBuilder.recursionDesired = false; replyCodeBuilder.responseCode = Header.ResponseCodes.NOERROR; replyCodeBuilder.truncation = false; replyCodeBuilder.authorities = 0; replyCodeBuilder.authoritativeAnswer = true; replyCodeBuilder.additional = 0; HeaderBuilder headerBuilder = new HeaderBuilder(replyCodeBuilder); headerBuilder.id = parsed.Id; DnsMessage dnsMessage = new DnsMessage(headerBuilder) { Answers = answers.ToArray(), Questions = parsed.Questions }; var pa = Parser.Parse(Serializer.Serialize(dnsMessage)); } var time = DateTime.Now.Subtract(now); Console.WriteLine($"Approximate Execution Time:\r\n{((double)time.Ticks * 100000 / (double)repetitions)} Picoseconds\r\n{(double)(((double)time.Ticks / (double)repetitions) * 100)} Nanoseconds\r\n{((double)time.Milliseconds / repetitions)} Milliseconds\r\n({time.Ticks} Ticks * 100000 / {repetitions} Repetitions)"); }
static void DoThing() { DateTime start; TimeSpan recieving; TimeSpan parsing; TimeSpan answering; TimeSpan sending; DateTime end; start = DateTime.Now; var parsed = Parser.Parse(Recieve(ref start, out recieving)); parsing = DateTime.Now.Subtract(start); List <Answer> answers = new List <Answer>(); ReplyCodeBuilder replyCodeBuilder = new ReplyCodeBuilder { isQuery = false, recursionAvailable = false, recursionDesired = false, truncation = false, authorities = 0, authoritativeAnswer = true, additional = 0, }; if (parsed.OpCode == Header.OpCodes.IQUERY) { replyCodeBuilder.responseCode = Header.ResponseCodes.SERVERFAILURE; } else { foreach (var question in parsed.Questions) { var ams = domainHandler.RetrieveSubDomain(question.RawBytes); Answer[] answerss = new Answer[0]; if (ams != null) { answerss = ams.GetAnswers(question); } if (ams == null) { Console.WriteLine($"{question.Raw} {question.Type} {question.Class} -> Name not found"); replyCodeBuilder.responseCode = Header.ResponseCodes.NAMEERROR; } else { if (answerss.Length < 1) { Console.WriteLine($"{question.Raw} {question.Type} {question.Class} -> No records found"); } else { Console.WriteLine($"{question.Raw} {question.Type} {question.Class} -> {ams.FQDN}"); replyCodeBuilder.responseCode = Header.ResponseCodes.NOERROR; answers.AddRange(answerss); foreach (var a in answerss) { Console.WriteLine($"\t{question.Raw} -> {a.a}"); } } } } } answering = DateTime.Now.Subtract(start); replyCodeBuilder.answers = (ushort)answers.Count; replyCodeBuilder.questions = parsed.QuestionCount; HeaderBuilder headerBuilder = new HeaderBuilder(replyCodeBuilder); headerBuilder.id = parsed.Id; DnsMessage dnsMessage = new DnsMessage(headerBuilder) { Answers = answers.ToArray(), Questions = parsed.Questions }; sending = DateTime.Now.Subtract(start); udpSock.SendTo(Serializer.Serialize(dnsMessage), _groupEp); end = DateTime.Now; ShowWaterfall(start, end, new KeyValuePair <string, TimeSpan>[] { new KeyValuePair <string, TimeSpan>("Recieving", recieving), new KeyValuePair <string, TimeSpan>("Parsing", parsing), new KeyValuePair <string, TimeSpan>("Answering", answering), new KeyValuePair <string, TimeSpan>("Sending", sending) }); }
public ReplyCode(ReplyCodeBuilder replyCode) { _questions = replyCode.questions; _answers = replyCode.answers; _authorities = replyCode.authorities; _additional = replyCode.additional; _authoritativeAnswer = replyCode.authoritativeAnswer; _isQuery = replyCode.isQuery; _truncation = replyCode.truncation; _recursionDesired = replyCode.recursionDesired; _recursionAvailable = replyCode.recursionAvailable; _opCode = replyCode.opCode; _responseCode = replyCode.responseCode; }