public void Query(string serverHost, int serverPort, string name, string qtype) { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); var ipv4Address = GetIpv4Address(serverHost); IPEndPoint endPoint = new IPEndPoint(ipv4Address, serverPort); socket.Connect(endPoint); var input = DnsUtils.CreateQuestionAsBytes(name, qtype); Console.WriteLine($"Sending: { input.Length }bytes data"); socket.Send(input); Console.WriteLine("Receiving..."); var output = new byte[512]; var c = socket.Receive(output); Console.WriteLine($"Received {c}bytes"); var dnsPacket = new byte[c]; Array.Copy(output, dnsPacket, c); DnsUtils.ReadAndPrintDnsMessage(dnsPacket); socket.Close(); }
private static IRecord ReadRecord(ByteReader byteReader) { var name = DnsUtils.ReadName(byteReader); var rtype = byteReader.GetUshort(); var rclass = byteReader.GetUshort(); var ttl = byteReader.GetUint(); if ((RecordType)rtype == RecordType.NS) { var record = new NSRecord() { Name = name, RClass = rclass, Ttl = ttl, }; var rdlength = byteReader.GetUshort(); record.Host = ReadName(byteReader); return(record); } else if ((RecordType)rtype == RecordType.A) { var rdlength = byteReader.GetUshort(); var ipv4 = ReadIpv4(byteReader); var record = new ARecord(name, ipv4) { RClass = rclass, Ttl = ttl, }; return(record); } else if ((RecordType)rtype == RecordType.AAAA) { var rdlength = byteReader.GetUshort(); var ipv6 = ReadIpv6(byteReader); var record = new AaaaRecord(name, ipv6) { RClass = rclass, Ttl = ttl, }; return(record); } else { var record = new Record() { Name = name, RType = rtype, RClass = (ushort)rclass, Ttl = ttl, }; var rdlength = byteReader.GetUshort(); record.RData = byteReader.GetBytes(rdlength); return(record); } }