private async void Respond(UdpReceiveResult query, CancellationToken token) { var stopwatch = Stopwatch.StartNew(); DnsHeader message; try { message = DnsByteExtensions.FromBytes <DnsHeader>(query.Buffer); } catch (Exception e) { _logger.LogCritical(e, "Unable to parse incoming packet: {0}", DnsByteExtensions.ToDebugString(query.Buffer)); return; } DnsAnswer answer; try { answer = await _dnsClient.Query(message, token); } catch (Exception e) { _logger.LogCritical(e, "Unable to resolve {0}", message); return; } var answerBytes = DnsByteExtensions.ToBytes(answer).ToArray(); try { await _listener.SendAsync(answerBytes, answerBytes.Length, query.RemoteEndPoint); } catch (Exception e) { _logger.LogCritical(e, "Unable to send back response to {0}", query.RemoteEndPoint); return; } _logger.LogTrace("Responded to DNS request for {Domain} in {ResponseTime}", message.Host, stopwatch.Elapsed.TotalSeconds); }
private async Task ReceiveTask() { while (!_cancel.IsCancellationRequested) { UdpReceiveResult recieve; try { recieve = await _socket.ReceiveAsync(); } catch (ObjectDisposedException) { // Do nothing, client shutting down return; } catch (Exception e) { _logger.LogCritical(e, "Received bad network response from {0}: {1}", recieve.RemoteEndPoint.ToString(), DnsByteExtensions.ToDebugString(recieve.Buffer)); continue; } if (recieve.Buffer.Length > 0) { _ = Task.Run(() => Receive(recieve.Buffer)); } } }