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
656
657
658
659
|
# File 'lib/resolv.rb', line 656
def initialize
@senders = {}
@socks = nil
end
|
Instance Method Details
#close ⇒ Object
712
713
714
715
716
|
# File 'lib/resolv.rb', line 712
def close
socks = @socks
@socks = nil
socks&.each(&:close)
end
|
#request(sender, tout) ⇒ Object
661
662
663
664
665
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
|
# File 'lib/resolv.rb', line 661
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
708
709
710
|
# File 'lib/resolv.rb', line 708
def sender_for(addr, msg)
@senders[[addr,msg.id]]
end
|