irb(main):003:0> MULTICAST_ADDR = '239.255.255.250'
=> "239.255.255.250"
irb(main):004:0> LOCATOR_PORT = 24067
=> 29067
irb(main):007:0> require 'socket'
=> true
irb(main):008:0> require 'ipaddr'
=> true
irb(main):009:0> membership = IPAddr.new(MULTICAST_ADDR).hton + IPAddr.new("0.0.0.0").hton
=> "\xEF\xFF\xFF\xFA\x00\x00\x00\x00"
irb(main):010:0> sock = UDPSocket.open
=> #<UDPSocket:fd 51>
irb(main):011:0> sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1)
=> 0
irb(main):012:0>
irb(main):013:0* begin
irb(main):014:1* sock.bind(Socket::INADDR_ANY, LOCATOR_PORT)
irb(main):015:1> rescue Errno::EADDRINUSE
irb(main):016:1> raise Error, "Unable to listen on port #{LOCATOR_PORT},"
irb(main):018:1> end
=> 0
irb(main):019:0>
irb(main):020:0* sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, membership)
=> 0
irb(main):021:0> sock.recvfrom(100)
Java::JavaLang::NullPointerException:
from org.jruby.ext.socket.RubyUDPSocket.doReceiveMulticast(RubyUDPSocket.java:483)
from org.jruby.ext.socket.RubyUDPSocket.doReceiveTuple(RubyUDPSocket.java:407)
from org.jruby.ext.socket.RubyUDPSocket.recvfrom(RubyUDPSocket.java:350)
from org.jruby.ext.socket.RubyIPSocket$INVOKER$i$recvfrom.call(RubyIPSocket$INVOKER$i$recvfrom.gen)
from org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:326)
from org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:170)
from org.jruby.ast.CallOneArgNode.interpret(CallOneArgNode.java:57)
from org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105)
from org.jruby.ast.RootNode.interpret(RootNode.java:129)
from org.jruby.evaluator.ASTInterpreter.INTERPRET_EVAL(ASTInterpreter.java:96)
from org.jruby.evaluator.ASTInterpreter.evalWithBinding(ASTInterpreter.java:175)
from org.jruby.RubyKernel.evalCommon(RubyKernel.java:1103)
from org.jruby.RubyKernel.eval19(RubyKernel.java:1066)
from org.jruby.RubyKernel$INVOKER$s$0$3$eval19.call(RubyKernel$INVOKER$s$0$3$eval19.gen)
from org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:178)
from org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:70)
... 115 levels...
from org.jruby.ast.BlockNode.interpret(BlockNode.java:71)
from org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:75)
from org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:182)
from org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:188)
from org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:326)
from org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:170)
from home.developer.$_dot_rvm.rubies.jruby_minus_1_dot_7_dot_2.bin.irb.__file__(/home/developer/.rvm/rubies/jruby-1.7.2/bin/irb:13)
from home.developer.$_dot_rvm.rubies.jruby_minus_1_dot_7_dot_2.bin.irb.load(/home/developer/.rvm/rubies/jruby-1.7.2/bin/irb)
from org.jruby.Ruby.runScript(Ruby.java:810)
from org.jruby.Ruby.runScript(Ruby.java:803)
from org.jruby.Ruby.runNormally(Ruby.java:674)
from org.jruby.Ruby.runFromMain(Ruby.java:523)
from org.jruby.Main.doRunFromMain(Main.java:390)
from org.jruby.Main.internalRun(Main.java:279)
from org.jruby.Main.run(Main.java:221)
from org.jruby.Main.main(Main.java:201)irb(main):022:0>