require 'socket' require 'ipaddr' class Multicast # listen for multicast messages # call block when recive any # # passes 2 elemnts to block, message, info # # * MSG: #{msg} # * from #{info[2]} # * (#{info[3]})/#{info[1]} # * length: #{msg.size}" def self.listen(address, port, &block) ip = IPAddr.new(address).hton + IPAddr.new("0.0.0.0").hton sock = UDPSocket.new sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ip) sock.bind(Socket::INADDR_ANY, port) loop do msg, info = sock.recvfrom(1024) block.call(msg, info) end end def self.propagate(ip,port, message) begin socket = UDPSocket.open socket.setsockopt(Socket::IPPROTO_IP, Socket::IP_TTL, [1].pack('i')) socket.send(message, 0, ip, port) ensure socket.close end end end