Beispiel #1
0
		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;
		}
Beispiel #2
0
        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;
        }