| Class | Resolv::DNS::Requester::ConnectedUDP |
| In: |
lib/resolv.rb
|
| Parent: | Requester |
# File lib/resolv.rb, line 620
620: def initialize(host, port=Port)
621: super()
622: @host = host
623: @port = port
624: @sock = UDPSocket.new(host.index(':') ? Socket::AF_INET6 : Socket::AF_INET)
625: @sock.connect(host, port)
626: @sock.fcntl(Fcntl::F_SETFD, 1) if defined? Fcntl::F_SETFD
627: @id = -1
628: @thread = Thread.new {
629: DNSThreadGroup.add Thread.current
630: loop {
631: reply = @sock.recv(UDPSize)
632: msg = begin
633: Message.decode(reply)
634: rescue DecodeError
635: STDERR.print("DNS message decoding error: #{reply.inspect}")
636: next
637: end
638: if s = @senders[msg.id]
639: s.recv msg
640: else
641: #STDERR.print("non-handled DNS message: #{msg.inspect}")
642: end
643: }
644: }
645: end
# File lib/resolv.rb, line 647
647: def sender(msg, data, queue, host=@host, port=@port)
648: unless host == @host && port == @port
649: raise RequestError.new("host/port don't match: #{host}:#{port}")
650: end
651: id = Thread.exclusive { @id = (@id + 1) & 0xffff }
652: request = msg.encode
653: request[0,2] = [id].pack('n')
654: return @senders[id] = Sender.new(request, data, @sock, queue)
655: end