| Class | Resolv::DNS::Requester::TCP |
| In: |
lib/resolv.rb
|
| Parent: | Requester |
# 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
# 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