Class: Resolv::DNS::Requester

Inherits:
Object
  • Object
show all
Defined in:
lib/fresolv.rb

Overview

:nodoc:

Direct Known Subclasses

ConnectedUDP, TCP, UnconnectedUDP

Defined Under Namespace

Classes: ConnectedUDP, RequestError, Sender, TCP, UnconnectedUDP

Instance Method Summary collapse

Constructor Details

#initializeRequester

Returns a new instance of Requester.



639
640
641
642
# File 'lib/fresolv.rb', line 639

def initialize
  @senders = {}
  @socks = nil
end

Instance Method Details

#closeObject



679
680
681
682
683
684
685
# File 'lib/fresolv.rb', line 679

def close
  socks = @socks
  @socks = nil
  if socks
    socks.each {|sock| sock.close }
  end
end

#request(sender, tout) ⇒ Object



644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
# File 'lib/fresolv.rb', line 644

def request(sender, tout)
  timelimit = Time.now + tout
  sender.send
  while true
    now = Time.now
    timeout = timelimit - now
    if timeout <= 0
      raise ResolvTimeout
    end
    select_result = IO.select(@socks, nil, nil, timeout)
    if !select_result
      raise ResolvTimeout
    end
    begin
      reply, from = recv_reply(select_result[0])
    rescue Errno::ECONNREFUSED, # GNU/Linux, FreeBSD
           Errno::ECONNRESET # Windows
      # No name server running on the server?
      # Don't wait anymore.
      raise ResolvTimeout
    end
    begin
      msg = Message.decode(reply)
    rescue DecodeError
      next # broken DNS message ignored
    end
    if s = @senders[[from,msg.id]]
      break
    else
      # unexpected DNS message ignored
    end
  end
  return msg, s.data
end