Example #1
0
        public async Task <IDnsResponse> Resolve(IDnsRequest request)
        {
            using (UdpClient udp = new UdpClient())
            {
                await udp
                .SendAsync(request.ToArray(), request.Size, dns)
                .WithCancellationTimeout(timeout);

                UdpReceiveResult result = await udp.ReceiveAsync().WithCancellationTimeout(timeout);

                if (!result.RemoteEndPoint.Equals(dns))
                {
                    throw new IOException("Remote endpoint mismatch");
                }
                byte[]             buffer   = result.Buffer;
                DefaultDnsResponse response = DefaultDnsResponse.FromArray(buffer);

                if (response.Truncated)
                {
                    return(await fallback.Resolve(request));
                }

                return(new ClientDnsResponse(request, response, buffer));
            }
        }
Example #2
0
        public async Task <IDnsResponse> Resolve(IDnsRequest request)
        {
            using (TcpClient tcp = new TcpClient())
            {
                await tcp.ConnectAsync(dns.Address, dns.Port);

                Stream stream = tcp.GetStream();
                byte[] buffer = request.ToArray();
                byte[] length = BitConverter.GetBytes((ushort)buffer.Length);

                if (BitConverter.IsLittleEndian)
                {
                    Array.Reverse(length);
                }

                await stream.WriteAsync(length, 0, length.Length);

                await stream.WriteAsync(buffer, 0, buffer.Length);

                buffer = new byte[2];
                await Read(stream, buffer);

                if (BitConverter.IsLittleEndian)
                {
                    Array.Reverse(buffer);
                }

                buffer = new byte[BitConverter.ToUInt16(buffer, 0)];
                await Read(stream, buffer);

                IDnsResponse response = DefaultDnsResponse.FromArray(buffer);
                return(new ClientDnsResponse(request, response, buffer));
            }
        }
        public static ClientDnsResponse FromArray(IDnsRequest request, byte[] message)
        {
            DefaultDnsResponse response = DefaultDnsResponse.FromArray(message);

            return(new ClientDnsResponse(request, response, message));
        }