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)); } }
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)); }