protected override async Task <IEnumerable <string>?> GetHostNameListImplAsync(IPAddress ip, Ref <DnsAdditionalResults>?additional = null, CancellationToken cancel = default)
    {
        DnsAdditionalResults additionalData = new DnsAdditionalResults(true, false);

        try
        {
            var res = await Client.QueryReverseAsync(ip, cancel);

            if (res.Header.ResponseCode == DnsHeaderResponseCode.NotExistentDomain)
            {
                additionalData = new DnsAdditionalResults(false, true);
            }

            if (res.HasError)
            {
                additionalData = new DnsAdditionalResults(true, false);
                return(null);
            }

            return(res.Answers?.PtrRecords().Select(x => x.PtrDomainName.ToString()).ToArray() ?? null);
        }
        finally
        {
            additional?.Set(additionalData);
        }
    }
    protected override async Task <IEnumerable <IPAddress>?> GetIpAddressListImplAsync(string hostname, DnsResolverQueryType queryType, Ref <DnsAdditionalResults>?additional = null, CancellationToken cancel = default)
    {
        DnsAdditionalResults additionalData = new DnsAdditionalResults(true, false);

        QueryType qt;

        switch (queryType)
        {
        case DnsResolverQueryType.A:
            qt = QueryType.A;
            break;

        case DnsResolverQueryType.AAAA:
            qt = QueryType.AAAA;
            break;

        default:
            throw new ArgumentOutOfRangeException(nameof(queryType));
        }

        try
        {
            var res = await Client.QueryAsync(hostname, qt, queryClass : QueryClass.IN, cancel);

            if (res.Header.ResponseCode == DnsHeaderResponseCode.NotExistentDomain)
            {
                additionalData = new DnsAdditionalResults(false, true);
            }

            if (res.HasError)
            {
                additionalData = new DnsAdditionalResults(true, false);
                return(null);
            }

            if (qt == QueryType.A)
            {
                return(res.Answers?.ARecords().Where(x => x.Address.AddressFamily == AddressFamily.InterNetwork).Select(x => x.Address).ToArray() ?? null);
            }
            else
            {
                return(res.Answers?.AaaaRecords().Where(x => x.Address.AddressFamily == AddressFamily.InterNetworkV6).Select(x => x.Address).ToArray() ?? null);
            }
        }
        finally
        {
            additional?.Set(additionalData);
        }
    }
Beispiel #3
0
 public ReverseLookupCacheItem(List <string>?value, DnsAdditionalResults additionalResults)
 {
     Value             = value;
     AdditionalResults = additionalResults;
 }
Beispiel #4
0
 public ForwardLookupCacheItem(List <IPAddress>?value, DnsAdditionalResults additionalResults)
 {
     Value             = value;
     AdditionalResults = additionalResults;
 }