예제 #1
0
        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);
        }
예제 #2
0
        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);
        }