# File lib/net/dns/resolver.rb, line 954
      def query(argument, type = Net::DNS::A, cls = Net::DNS::IN)
        if @config[:nameservers].size == 0
          raise Resolver::Error, "No nameservers specified!"
        end

        method = :query_udp
        packet = if argument.kind_of? Net::DNS::Packet
          argument
        else
          make_query_packet(argument, type, cls)
        end

        # Store packet_data for performance improvements,
        # so methods don't keep on calling Packet#data
        packet_data = packet.data
        packet_size = packet_data.size

        # Choose whether use TCP, UDP or RAW
        if packet_size > @config[:packet_size] # Must use TCP, either plain or raw
          if @raw # Use raw sockets?
            @logger.info "Sending #{packet_size} bytes using TCP over RAW socket"
            method = :send_raw_tcp
          else
            @logger.info "Sending #{packet_size} bytes using TCP"
            method = :query_tcp
          end
        else # Packet size is inside the boundaries
          if @raw # Use raw sockets?
            @logger.info "Sending #{packet_size} bytes using UDP over RAW socket"
            method = :send_raw_udp
          elsif use_tcp? # User requested TCP
            @logger.info "Sending #{packet_size} bytes using TCP"
            method = :query_tcp
          else # Finally use UDP
            @logger.info "Sending #{packet_size} bytes using UDP"
          end
        end

        if type == Net::DNS::AXFR
          if @raw
            @logger.warn "AXFR query, switching to TCP over RAW socket"
            method = :send_raw_tcp
          else
            @logger.warn "AXFR query, switching to TCP"
            method = :query_tcp
          end
        end

        ans = self.send(method, packet, packet_data)

        unless ans
          message = "No response from nameservers list"
          @logger.fatal(message)
          raise NoResponseError, message
        end

        @logger.info "Received #{ans[0].size} bytes from #{ans[1][2]+":"+ans[1][1].to_s}"
        response = Net::DNS::Packet.parse(ans[0],ans[1])

        if response.header.truncated? and not ignore_truncated?
          @logger.warn "Packet truncated, retrying using TCP"
          self.use_tcp = true
          begin
            return query(argument,type,cls)
          ensure
            self.use_tcp = false
          end
        end

        return response
      end