Class Resolv::DNS::Requester::TCP
In: lib/resolv.rb
Parent: Requester

Methods

new   sender  

Classes and Modules

Class Resolv::DNS::Requester::TCP::Sender

Public Class methods

[Source]

     # File lib/resolv.rb, line 665
665:         def initialize(host, port=Port)
666:           super()
667:           @host = host
668:           @port = port
669:           @sock = TCPSocket.new
670:           @sock.connect(host, port)
671:           @sock.fcntl(Fcntl::F_SETFD, 1) if defined? Fcntl::F_SETFD
672:           @id = -1
673:           @senders = {}
674:           @thread = Thread.new {
675:             DNSThreadGroup.add Thread.current
676:             loop {
677:               len = @sock.read(2).unpack('n')
678:               reply = @sock.read(len)
679:               msg = begin
680:                 Message.decode(reply)
681:               rescue DecodeError
682:                 STDERR.print("DNS message decoding error: #{reply.inspect}")
683:                 next
684:               end
685:               if s = @senders[msg.id]
686:                 s.push msg
687:               else
688:                 #STDERR.print("non-handled DNS message: #{msg.inspect}")
689:               end
690:             }
691:           }
692:         end

Public Instance methods

[Source]

     # File lib/resolv.rb, line 694
694:         def sender(msg, data, queue, host=@host, port=@port)
695:           unless host == @host && port == @port
696:             raise RequestError.new("host/port don't match: #{host}:#{port}")
697:           end
698:           id = Thread.exclusive { @id = (@id + 1) & 0xffff }
699:           request = msg.encode
700:           request[0,2] = [request.length, id].pack('nn')
701:           return @senders[id] = Sender.new(request, data, @sock, queue)
702:         end

[Validate]