Exemplo n.º 1
0
 public void Quit()
 {
     ConsolePainter.WriteWarning($"Saving data to {CacheFilename}...");
     SerializeCache();
     closed = true;
     udpListener?.Dispose();
 }
Exemplo n.º 2
0
        public DnsServer()
        {
            var dnsips = Dns.GetHostAddresses("ns1.e1.ru");

            remoteDns = new IPEndPoint(dnsips[0], 53);
            cache     = DeserializeCache();
            var total = 0;

            foreach (var kvp in cache)
            {
                foreach (var _ in kvp.Value.Values)
                {
                    total++;
                }
            }

            ConsolePainter.WriteWarning($"Deserialized {total} entries");
        }
Exemplo n.º 3
0
        private void RemoveOldEntries()
        {
            var toDelete = new List <(ResourceType, string)>();

            foreach (var recordType in cache)
            {
                foreach (var record in recordType.Value)
                {
                    if (record.Value.IsOutdated())
                    {
                        toDelete.Add((recordType.Key, record.Key));
                    }
                }
            }


            foreach (var element in toDelete)
            {
                ConsolePainter.WriteWarning($"Deleting {element.Item2} entry from cache...");
                cache[element.Item1].Remove(element.Item2);
            }
        }
Exemplo n.º 4
0
        private byte[] GetAnswerFromBetterServer(byte[] query, Dictionary <string, DnsPacket> subCache)
        {
            using (var client = new UdpClient())
            {
                client.Client.ReceiveTimeout = 2000;
                client.Send(query, query.Length, remoteDns);
                byte[] response;
                try
                {
                    response = client.Receive(ref remoteDns);
                }
                catch (SocketException)
                {
                    ConsolePainter.WriteWarning("Couldn't connect to the upper server. Check internet connection");
                    return(null);
                }

                var responsePacket = new DnsPacket(response);
                ConsolePainter.WriteResponse($"SENDING:\n{responsePacket}");
                subCache[responsePacket.Questions[0].Name] = responsePacket;
                return(response);
            }
        }
Exemplo n.º 5
0
        private byte[] HandleRequest(byte[] data)
        {
            var query = new DnsPacket(data);

            ConsolePainter.WriteRequest($"GOT:\n{query}");

            if (!query.IsQuery)
            {
                return(null);
            }

            foreach (var question in query.Questions)
            {
                if (SupportedTypes.Contains(question.Type))
                {
                    return(FindCachedAnswerOrResend(query, cache[question.Type]));
                }

                ConsolePainter.WriteWarning(
                    $"Message with the type code {question.Type} is not currently supported!");
            }

            return(null);
        }