private void SendSuccessfulResponse(DNSFrame dnsFrame, ExtensionResourceRecords answer, EndPoint ipAddress) { var responseFrame = dnsFrame; responseFrame.Header.QR = 1; responseFrame.Header.ANCOUNT = (ushort)answer.Records.Count; responseFrame.Answers = answer; var frameAsBytes = Converter.DnsFrameToByte(responseFrame); socket.SendTo(frameAsBytes, ipAddress); }
private async void ResolveQuestion(DNSFrame dnsFrame, EndPoint ipAddress) { var answer = new ExtensionResourceRecords(); foreach (var question in dnsFrame.Questions.Records) { var source = DomainToIp; //Console.WriteLine(question.QType + "<-QType"); if (question.QType == 12) { //Console.WriteLine("12"); source = IpToDomain; } if (source.ContainsKey(question.DomainName)) { var responces = source[question.DomainName]; foreach (var responce in responces) { var dnsResponce = new Record(question, responce); answer.Records.Add(dnsResponce); } } else { //Если в кэше нет данных, то делать запрос к вышестоящиму серверу //делаьь это нужно ассинхронно, т.е awat void у этого метода т.к нам не //важен резульатат, и если таймаут истёк, ну шо поделать отправляем клиенту //наши сожиления по этому поводу await SendQueryAsync(dnsFrame); if (!source.ContainsKey(question.DomainName)) { SendBadResponse(dnsFrame, ipAddress); break; } var responces = source[question.DomainName]; foreach (var responce in responces) { var dnsResponce = new Record(question, responce); answer.Records.Add(dnsResponce); } } } SendSuccessfulResponse(dnsFrame, answer, ipAddress); }