Method: ZeroConf::Utils#open_ipv6

Defined in:
lib/zeroconf/utils.rb

#open_ipv6(saddr, port) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/zeroconf/utils.rb', line 101

def open_ipv6 saddr, port
  sock = UDPSocket.new Socket::AF_INET6
  sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
  sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true)
  sock.setsockopt(Socket::IPPROTO_IPV6, Socket::IPV6_MULTICAST_HOPS, true)
  sock.setsockopt(Socket::IPPROTO_IPV6, Socket::IPV6_MULTICAST_LOOP, true)

  # This address isn't correct, but giving it to IPAddr seems to result
  # in the right bytes back from hton.
  # See: https://github.com/ruby/ipaddr/issues/63
  s = IPAddr.new("ff02:0000:0000:0000:0000:00fb:0000:0000").hton
  sock.setsockopt(Socket::IPPROTO_IPV6, Socket::IPV6_JOIN_GROUP, s)
  sock.setsockopt(Socket::IPPROTO_IPV6, Socket::IPV6_MULTICAST_IF, IPAddr.new(saddr.ip_address).hton)
  sock.bind saddr.ip_address, port
  flags = sock.fcntl(Fcntl::F_GETFL, 0)
  sock.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK | flags)

  sock
rescue SystemCallError
end