public async Task Lookup_RetryOnDnsErrorAsync()
        {
            var lookup = new LookupClient(
                new NameServer(IPAddress.Parse("127.0.0.1")),
                new NameServer(IPAddress.Parse("127.0.0.2")),
                new NameServer(IPAddress.Parse("127.0.0.3")),
                new NameServer(IPAddress.Parse("127.0.0.4")),
                new NameServer(IPAddress.Parse("127.0.0.5")),
                new NameServer(IPAddress.Parse("127.0.0.6")),
                new NameServer(IPAddress.Parse("127.0.0.7")))
            {
                EnableAuditTrail   = true,
                ContinueOnDnsError = true
            };

            var calledIps      = new List <IPAddress>();
            var messageHandler = new TestMessageHandler((ip, req) =>
            {
                calledIps.Add(ip.Address);
                return(new DnsResponseMessage(
                           new DnsResponseHeader(1, (int)DnsResponseCode.NotExistentDomain, 0, 0, 0, 0),
                           0));
            });

            var request = new DnsRequestMessage(
                new DnsRequestHeader(0, DnsOpCode.Query),
                new DnsQuestion("test.com", QueryType.A, QueryClass.IN));

            var result = await lookup.ResolveQueryAsync(lookup.GetNextServers(), messageHandler, request, false);

            // no exception but error in the response after calling all 3 endpoints!
            Assert.True(result.HasError);
            Assert.Equal(DnsResponseCode.NotExistentDomain, result.Header.ResponseCode);

            // ensure the client tried all the configured endpoints
            Assert.Equal(7, calledIps.Count);
        }
        public void Lookup_PreserveNameServerOrder()
        {
            var lookup = new LookupClient(
                new NameServer(IPAddress.Parse("127.0.0.1")),
                new NameServer(IPAddress.Parse("127.0.0.2")),
                new NameServer(IPAddress.Parse("127.0.0.3")))
            {
                // default is true
                UseRandomNameServer = false
            };

            var calledIps      = new List <IPAddress>();
            var messageHandler = new TestMessageHandler((ip, req) =>
            {
                calledIps.Add(ip.Address);
                return(new DnsResponseMessage(
                           new DnsResponseHeader(1, (int)DnsResponseCode.NoError, 0, 0, 0, 0),
                           0));
            });

            // calling multiple times will always use the first server when it returns NoError.
            // No other servers should be called
            for (var i = 0; i < 3; i++)
            {
                var request = new DnsRequestMessage(
                    new DnsRequestHeader(i, DnsOpCode.Query),
                    new DnsQuestion("test.com", QueryType.A, QueryClass.IN));

                var result = lookup.ResolveQuery(lookup.GetNextServers(), messageHandler, request, false);
                Assert.False(result.HasError);
            }

            Assert.Equal(3, calledIps.Count);
            Assert.Equal(IPAddress.Parse("127.0.0.1"), calledIps[0]);
            Assert.Equal(IPAddress.Parse("127.0.0.1"), calledIps[1]);
            Assert.Equal(IPAddress.Parse("127.0.0.1"), calledIps[2]);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 通过数据转换
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public DnsClientRequest FromArray(byte[] message)
        {
            DnsRequestMessage request = DnsRequestMessage.FromArray(message);

            return(new DnsClientRequest(_coder, request));
        }
Exemplo n.º 4
0
        public DnsResponseMessage Resolve(IPEndPoint server, string domainNameToResolve)
        {
            DnsRequestMessage request = messageProcessor.ProcessRequest(domainNameToResolve);

            return(Resolve(server, request));
        }
 public override Task <DnsResponseMessage> QueryAsync(IPEndPoint endpoint, DnsRequestMessage request, CancellationToken cancellationToken, Action <Action> cancelationCallback)
 {
     return(Task.FromResult(_onQuery(endpoint, request)));
 }
 public override DnsResponseMessage Query(IPEndPoint endpoint, DnsRequestMessage request, TimeSpan timeout)
 {
     return(_onQuery(endpoint, request));
 }