Class: Resolv::DNS::Requester
- Inherits:
-
Object
- Object
- Resolv::DNS::Requester
show all
- Defined in:
- lib/resolv.rb
Overview
Defined Under Namespace
Classes: ConnectedUDP, MDNSOneShot, RequestError, Sender, TCP, UnconnectedUDP
Instance Method Summary
collapse
Constructor Details
666
667
668
669
|
# File 'lib/resolv.rb', line 666
def initialize
@senders = {}
@socks = nil
end
|
Instance Method Details
#close ⇒ Object
722
723
724
725
726
727
728
|
# File 'lib/resolv.rb', line 722
def close
socks = @socks
@socks = nil
if socks
socks.each {|sock| sock.close }
end
end
|
#request(sender, tout) ⇒ Object
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
708
709
710
711
712
713
714
715
716
|
# File 'lib/resolv.rb', line 671
def request(sender, tout)
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
timelimit = start + tout
begin
sender.send
rescue Errno::EHOSTUNREACH, Errno::ENETUNREACH
raise ResolvTimeout
end
while true
before_select = Process.clock_gettime(Process::CLOCK_MONOTONIC)
timeout = timelimit - before_select
if timeout <= 0
raise ResolvTimeout
end
if @socks.size == 1
select_result = @socks[0].wait_readable(timeout) ? [ @socks ] : nil
else
select_result = IO.select(@socks, nil, nil, timeout)
end
if !select_result
after_select = Process.clock_gettime(Process::CLOCK_MONOTONIC)
next if after_select < timelimit
raise ResolvTimeout
end
begin
reply, from = recv_reply(select_result[0])
rescue Errno::ECONNREFUSED, Errno::ECONNRESET raise ResolvTimeout
end
begin
msg = Message.decode(reply)
rescue DecodeError
next end
if s = sender_for(from, msg)
break
else
end
end
return msg, s.data
end
|
#sender_for(addr, msg) ⇒ Object
718
719
720
|
# File 'lib/resolv.rb', line 718
def sender_for(addr, msg)
@senders[[addr,msg.id]]
end
|