Class: Resolv::DNS::Requester

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

Overview

:nodoc:

Direct Known Subclasses

ConnectedUDP, TCP, UnconnectedUDP

Defined Under Namespace

Classes: ConnectedUDP, MDNSOneShot, RequestError, Sender, TCP, UnconnectedUDP

Instance Method Summary collapse

Constructor Details

#initializeRequester

Returns a new instance of Requester.



661
662
663
664
# File 'lib/resolv.rb', line 661

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

Instance Method Details

#closeObject



713
714
715
716
717
718
719
# File 'lib/resolv.rb', line 713

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

#request(sender, tout) ⇒ Object



666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
# File 'lib/resolv.rb', line 666

def request(sender, tout)
  start = Time.now
  timelimit = start + tout
  begin
    sender.send
  rescue Errno::EHOSTUNREACH
    # multi-homed IPv6 may generate this
    raise ResolvTimeout
  end
  while true
    before_select = Time.now
    timeout = timelimit - before_select
    if timeout <= 0
      raise ResolvTimeout
    end
    select_result = IO.select(@socks, nil, nil, timeout)
    if !select_result
      after_select = Time.now
      next if after_select < timelimit
      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 = sender_for(from, msg)
      break
    else
      # unexpected DNS message ignored
    end
  end
  return msg, s.data
end

#sender_for(addr, msg) ⇒ Object



709
710
711
# File 'lib/resolv.rb', line 709

def sender_for(addr, msg)
  @senders[[addr,msg.id]]
end