PageRenderTime 37ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/dnssd/reply/resolve.rb

http://github.com/tenderlove/dnssd
Ruby | 100 lines | 50 code | 27 blank | 23 comment | 2 complexity | 89d6bbb4bf7260499f02b8acd1844922 MD5 | raw file
  1. ##
  2. # Created by DNSSD::Service#resolve
  3. class DNSSD::Reply::Resolve < DNSSD::Reply
  4. ##
  5. # A domain for registration or browsing
  6. attr_reader :domain
  7. ##
  8. # The service name
  9. attr_reader :name
  10. ##
  11. # The port for this service
  12. attr_reader :port
  13. ##
  14. # The hostname of the host provide the service
  15. attr_reader :target
  16. ##
  17. # The service's primary text record
  18. attr_reader :text_record
  19. ##
  20. # The service type
  21. attr_reader :type
  22. ##
  23. # Creates a new Resolve, called internally by DNSSD::Service#resolve
  24. def initialize(service, flags, interface, fullname, target, port,
  25. text_record)
  26. super service, flags, interface
  27. set_fullname fullname
  28. @target = target
  29. @port = port
  30. @text_record = DNSSD::TextRecord.new text_record
  31. end
  32. ##
  33. # Connects to this Reply. If #target and #port are missing, DNSSD.resolve
  34. # is automatically called.
  35. #
  36. # +family+ can be used to select a particular address family (IPv6 vs IPv4).
  37. #
  38. # +addrinfo_flags+ are passed to DNSSD::Service#getaddrinfo as flags.
  39. def connect(family = Socket::AF_UNSPEC, addrinfo_flags = 0)
  40. addrinfo_protocol = case family
  41. when Socket::AF_INET then DNSSD::Service::IPv4
  42. when Socket::AF_INET6 then DNSSD::Service::IPv6
  43. when Socket::AF_UNSPEC then 0
  44. else raise ArgumentError, "invalid family #{family}"
  45. end
  46. service = DNSSD::Service.getaddrinfo target, addrinfo_protocol,
  47. addrinfo_flags, @interface
  48. service.each do |addrinfo|
  49. address = addrinfo.address
  50. begin
  51. socket = nil
  52. case protocol
  53. when 'tcp' then
  54. socket = TCPSocket.new address, port
  55. when 'udp' then
  56. socket = UDPSocket.new
  57. socket.connect address, port
  58. end
  59. service.stop
  60. return socket
  61. rescue
  62. next if addrinfo.flags.more_coming?
  63. raise
  64. end
  65. end
  66. end
  67. def inspect # :nodoc:
  68. "#<%s:0x%x %s at %s:%d text_record: %p interface: %s flags: %p>" % [
  69. self.class, object_id,
  70. fullname, @target, @port, @text_record, interface_name, @flags
  71. ]
  72. end
  73. end