public async Task<IPAddress[]> ResolveAsync(string hostname, int timeout = 2000) { IPEndPoint mdnsEndPoint = new IPEndPoint(MulticastAddress, Port); UdpClient client = new UdpClient(); DnsPacket questionPacket = new DnsPacket(); if (!hostname.EndsWith(HostnameSuffix)) { hostname += HostnameSuffix; } questionPacket.Questions.Add(new DnsQuestion(hostname, DnsRecordType.A, DnsRecordClass.InterNetwork)); byte[] data = questionPacket.ToBytes(); client.JoinMulticastGroup(MulticastAddress); client.Send(data, data.Length, mdnsEndPoint); client.Client.ReceiveTimeout = timeout; DateTime endTime = DateTime.Now + new TimeSpan(0, 0, 0, 0, timeout); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(timeout); while (DateTime.Now < endTime) { UdpReceiveResult receiveTask = await Task.Run(client.ReceiveAsync, cancellationTokenSource.Token); DnsPacket responsePacket = DnsPacket.FromBytes(receiveTask.Buffer); if (responsePacket.ID == questionPacket.ID && responsePacket.AnswerCount > 0) { List<IPAddress> results = new List<IPAddress>(); foreach (var answer in responsePacket.Answers) { DnsARecord aRecord = answer as DnsARecord; if (aRecord != null) { results.Add(aRecord.IPAddress); } } if (results.Count > 0) { return results.ToArray(); } } } return null; }
static void Main(string[] args) { // connect to DNS server using (var server = new MockDnsServer()) { // create zone var zone = server.CreateZone("myzone.mock"); // get zone by name var myZoneRef = server.GetZone("myzone.mock"); // get records var myServerRecords = zone.GetRecords(DnsRecordTypes.A, "myserver.myzone.mock"); // search records var allMyServerRecords = zone.SearchRecords("MyServer"); var hostMyServerRecords = zone.SearchRecords(DnsRecordTypes.A, "MyServer"); // update record var soa = zone.StartOfAuthority; soa.TimeToLive = TimeSpan.FromMinutes(30); soa.ResponsiblePerson = "responsible.hostmaster."; soa.Save(); // or: zone.SaveRecord(soa); // create host record var hostTemplate = new DnsARecord("myhost.myzone.mock", TimeSpan.FromHours(1), "192.168.1.50"); var hostRecord = zone.CreateRecord(hostTemplate); // add second host record hostTemplate.IpAddress = "192.168.1.51"; var hostRecord2 = zone.CreateRecord(hostTemplate); // create alias record var cnameTemplate = new DnsCNAMERecord("myhostalias.myzone.mock", TimeSpan.FromHours(1), "myhost.myzone.mock"); var cnameRecord = zone.CreateRecord(cnameTemplate); // create service locator record var srvTemplate = new DnsSRVRecord( domainName: "myzone.mock", service: DnsSRVRecord.ServiceNames.LDAP, protocol: DnsSRVRecord.ProtocolNames.TCP, timeToLive: TimeSpan.FromHours(1), priority: 0, weight: 10, port: DnsSRVRecord.ServicePorts.LDAP, targetDomainName: "mycontroller.myzone.mock"); var srvRecord = zone.CreateRecord(srvTemplate); // delete record hostRecord.Delete(); // or: zone.DeleteRecord(aRecord); DumpDnsServer(server); // delete zone zone.Delete(); // or: server.DeleteZone(zone); // or: server.DeleteZone("myzone.mock"); } }
public static IDnsRecord Create(ref MemoryStream ms) { IDnsRecord dnsRecord; // Have to start out with an unknown record, since we have to parse the entire // header before we can determine the type of DNS record it is. // TODO: Consider other options. // start as an unknown type, then create a known type, parse the response // and return the object. //DnsRecordBase dr = new DnsUnknownRecord(); //dr.ParseRecordHeader(ref ms); DnsRecordHeader dnsHeader = new DnsRecordHeader(); dnsHeader.ParseRecordHeader(ref ms); switch (dnsHeader.NsType) { case NsType.A: { dnsRecord = new DnsARecord(dnsHeader); break; } case NsType.AAAA: { dnsRecord = new DnsAaaaRecord(dnsHeader); break; } case NsType.MX: { dnsRecord = new DnsMxRecord(dnsHeader); break; } case NsType.RP: { dnsRecord = new DnsRpRecord(dnsHeader); break; } case NsType.MR: { dnsRecord = new DnsMrRecord(dnsHeader); break; } case NsType.MB: { dnsRecord = new DnsMbRecord(dnsHeader); break; } case NsType.MG: { dnsRecord = new DnsMgRecord(dnsHeader); break; } case NsType.NS: { dnsRecord = new DnsNsRecord(dnsHeader); break; } case NsType.CNAME: { dnsRecord = new DnsCnameRecord(dnsHeader); break; } case NsType.PTR: { dnsRecord = new DnsPtrRecord(dnsHeader); break; } case NsType.HINFO: { dnsRecord = new DnsHinfoRecord(dnsHeader); break; } case NsType.MINFO: { dnsRecord = new DnsMinfoRecord(dnsHeader); break; } case NsType.X25: { dnsRecord = new DnsX25Record(dnsHeader); break; } case NsType.TXT: { dnsRecord = new DnsTxtRecord(dnsHeader); break; } case NsType.LOC: { dnsRecord = new DnsLocRecord(dnsHeader); break; } case NsType.SOA: { dnsRecord = new DnsSoaRecord(dnsHeader); break; } case NsType.SRV: { dnsRecord = new DnsSrvRecord(dnsHeader); break; } case NsType.AFSDB: { dnsRecord = new DnsAfsdbRecord(dnsHeader); break; } case NsType.ATMA: { dnsRecord = new DnsAtmaRecord(dnsHeader); break; } case NsType.ISDN: { dnsRecord = new DnsIsdnRecord(dnsHeader); break; } case NsType.RT: { dnsRecord = new DnsRtRecord(dnsHeader); break; } case NsType.WKS: { dnsRecord = new DnsWksRecord(dnsHeader); break; } default: { // Unknown type. parse and return the DnsUnknownRecord dnsRecord = new DnsUnknownRecord(dnsHeader); break; } } //dnsRecord.ParseRecordHeader(ref ms); dnsRecord.ParseRecord(ref ms); return dnsRecord; }