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(); } }
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); }); } }
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")); }
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); } }