Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
                }
            }
        }