Example #1
0
        private DnsPackage ResolveFromServer(DnsPackage request)
        {
            UdpClient  udp = new UdpClient();
            IPEndPoint dns = new IPEndPoint(IPAddress.Parse(SERVER_ADDRESS), DEFAULT_PORT);

            udp.Client.ReceiveTimeout = UDP_TIMEOUT;

            try
            {
                udp.Connect(dns);
                var bytes = request.GetBytes();
                udp.Send(bytes, bytes.Length);
                byte[]     buffer   = udp.Receive(ref dns);
                DnsPackage response = DnsPackage.FromArray(buffer);                 //null;


                return(response);
            }
            catch
            {
                throw;
                return(ResolveFromServer(request));
            }
            finally
            {
                udp.Close();
            }
        }
Example #2
0
        private void AcceptClients(UdpClient udp, IPEndPoint endPoint)
        {
            while (true)
            {
                byte[] clientMessage;
                try
                {
                    clientMessage = udp.Receive(ref endPoint);
                    Console.WriteLine("CONNECTED");
                }
                catch (SocketException)
                {
                    continue;
                }

                var taskEndPoint = endPoint;
                Task.Factory.StartNew(() =>
                {
                    Console.WriteLine("I'M IN TASK");

                    var request = DnsPackage.FromArray(clientMessage);

                    DnsPackage response     = ResolveRequest(request);
                    response.Header.ANCOUNT = (short)(response.Answers.Count);

                    response.Header.ARCOUNT = 0;
                    response.Header.NSCOUNT = 0;

                    var bytes = response.GetBytes();
                    udp.Send(bytes, bytes.Length, taskEndPoint);
                });
            }
        }
Example #3
0
        public string Resolve(string domain, string requestType)
        {
            var endPoint = new IPEndPoint(IPAddress.Parse(ip), DEFAULT_PORT);

            var udp = new UdpClient();

            udp.Connect(endPoint);

            udp.Client.SendTimeout = UDP_TIMEOUT;

            var sender = new IPEndPoint(IPAddress.Any, DEFAULT_PORT);

            var        packageType = requestType == "NS" ? Package.Type.NS : Package.Type.A;
            DnsPackage request     = new DnsPackage(new PackageHeader(), new PackageQuestion(domain, packageType), new List <PackageAnswer>());
            var        bytes       = request.GetBytes();

            udp.Send(bytes, bytes.Length);

            var serverMessage = udp.Receive(ref endPoint);
            var answer        = DnsPackage.FromArray(serverMessage);

            return(answer.Answers.Select(x => x.GetAnswer(serverMessage)).Aggregate("", (current, ans) => current + ans + "\r\n"));
        }
Example #4
0
 private DnsPackage ResolveRequest(DnsPackage request)
 {
     lock (storage)
     {
         if (storage.ContainKey(request.Question))
         {
             return(new DnsPackage(request.Header, request.Question, storage.Get(request.Question)));
         }
     }
     try
     {
         var answer = ResolveFromServer(request);
         lock (storage)
         {
             storage.Add(request.Question, answer.Answers);
             foreach (var addit in answer.Additionals)
             {
                 storage.Add(addit.Question, new List <PackageAnswer> {
                     addit
                 });
             }
             foreach (var a in answer.Auth)
             {
                 storage.Add(a.Question, new List <PackageAnswer> {
                     a
                 });
             }
         }
         return(answer);
     }
     catch
     {
         throw;
         return(request);
     }
 }