diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | lib/rinda/ring.rb | 30 |
2 files changed, 22 insertions, 13 deletions
@@ -1,3 +1,8 @@ +Sun Jun 1 11:36:25 2014 Tanaka Akira <akr@fsij.org> + + * lib/rinda/ring.rb (RingFinger#make_socket): Close the socket on + exception. + Sun Jun 1 06:55:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> * parse.y (intern_str): dynamic attrset ID is registered by diff --git a/lib/rinda/ring.rb b/lib/rinda/ring.rb index deef114092..e36c93b0a3 100644 --- a/lib/rinda/ring.rb +++ b/lib/rinda/ring.rb @@ -413,22 +413,26 @@ module Rinda addrinfo = Addrinfo.udp(address, @port) soc = Socket.new(addrinfo.pfamily, addrinfo.socktype, addrinfo.protocol) + begin + if addrinfo.ipv4_multicast? then + soc.setsockopt(Socket::Option.ipv4_multicast_loop(1)) + soc.setsockopt(Socket::Option.ipv4_multicast_ttl(@multicast_hops)) + elsif addrinfo.ipv6_multicast? then + soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_LOOP, true) + soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_HOPS, + [@multicast_hops].pack('I')) + soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_IF, + [@multicast_interface].pack('I')) + else + soc.setsockopt(:SOL_SOCKET, :SO_BROADCAST, true) + end - if addrinfo.ipv4_multicast? then - soc.setsockopt(Socket::Option.ipv4_multicast_loop(1)) - soc.setsockopt(Socket::Option.ipv4_multicast_ttl(@multicast_hops)) - elsif addrinfo.ipv6_multicast? then - soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_LOOP, true) - soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_HOPS, - [@multicast_hops].pack('I')) - soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_IF, - [@multicast_interface].pack('I')) - else - soc.setsockopt(:SOL_SOCKET, :SO_BROADCAST, true) + soc.connect(addrinfo) + rescue Exception + soc.close + raise end - soc.connect(addrinfo) - soc end |