/// <summary>
		///   Queries a dns server for specified records.
		/// </summary>
		/// <param name="name"> Domain, that should be queried </param>
		/// <param name="recordType"> Type the should be queried </param>
		/// <param name="recordClass"> Class the should be queried </param>
		/// <param name="options"> Options for the query </param>
		/// <returns> The complete response of the dns server </returns>
		public DnsMessage Resolve(DomainName name, RecordType recordType = RecordType.A, RecordClass recordClass = RecordClass.INet, DnsQueryOptions options = null)
		{
			if (name == null)
				throw new ArgumentNullException(nameof(name), "Name must be provided");

			DnsMessage message = new DnsMessage() { IsQuery = true, OperationCode = OperationCode.Query, IsRecursionDesired = true, IsEDnsEnabled = true };

			if (options == null)
			{
				message.IsRecursionDesired = true;
				message.IsEDnsEnabled = true;
			}
			else
			{
				message.IsRecursionDesired = options.IsRecursionDesired;
				message.IsCheckingDisabled = options.IsCheckingDisabled;
				message.EDnsOptions = options.EDnsOptions;
			}

			message.Questions.Add(new DnsQuestion(name, recordType, recordClass));

			return SendMessage(message);
		}
        /// <summary>
        ///   Queries a dns server for specified records.
        /// </summary>
        /// <param name="name"> Domain, that should be queried </param>
        /// <param name="recordType"> Type the should be queried </param>
        /// <param name="recordClass"> Class the should be queried </param>
        /// <param name="options"> Options for the query </param>
        /// <returns> The complete response of the dns server </returns>
        public DnsMessage Resolve(DomainName name, RecordType recordType = RecordType.A, RecordClass recordClass = RecordClass.INet, DnsQueryOptions options = null)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name), "Name must be provided");
            }

            DnsMessage message = new DnsMessage()
            {
                IsQuery = true, OperationCode = OperationCode.Query, IsRecursionDesired = true, IsEDnsEnabled = true
            };

            if (options == null)
            {
                message.IsRecursionDesired = true;
                message.IsEDnsEnabled      = true;
            }
            else
            {
                message.IsRecursionDesired = options.IsRecursionDesired;
                message.IsCheckingDisabled = options.IsCheckingDisabled;
                message.EDnsOptions        = options.EDnsOptions;
            }

            message.Questions.Add(new DnsQuestion(name, recordType, recordClass));

            return(SendMessage(message));
        }
		/// <summary>
		///   Queries a dns server for specified records as an asynchronous operation.
		/// </summary>
		/// <param name="name"> Domain, that should be queried </param>
		/// <param name="recordType"> Type the should be queried </param>
		/// <param name="recordClass"> Class the should be queried </param>
		/// <param name="options"> Options for the query </param>
		/// <param name="token"> The token to monitor cancellation requests </param>
		/// <returns> The complete response of the dns server </returns>
		public Task<DnsMessage> ResolveAsync(DomainName name, RecordType recordType = RecordType.A, RecordClass recordClass = RecordClass.INet, DnsQueryOptions options = null, CancellationToken token = default(CancellationToken))
		{
			if (name == null)
				throw new ArgumentNullException(nameof(name), "Name must be provided");

			DnsMessage message = new DnsMessage() { IsQuery = true, OperationCode = OperationCode.Query, IsRecursionDesired = true, IsEDnsEnabled = true };

			if (options == null)
			{
				message.IsRecursionDesired = true;
				message.IsEDnsEnabled = true;
			}
			else
			{
				message.IsRecursionDesired = options.IsRecursionDesired;
				message.IsCheckingDisabled = options.IsCheckingDisabled;
				message.EDnsOptions = options.EDnsOptions;
			}

			message.Questions.Add(new DnsQuestion(name, recordType, recordClass));

			return SendMessageAsync(message, token);
		}