diff --git a/network-multicast.cabal b/network-multicast.cabal
--- a/network-multicast.cabal
+++ b/network-multicast.cabal
@@ -1,5 +1,5 @@
 name:               network-multicast
-version:            0.0.7
+version:            0.0.8
 copyright:          2008-2012 Audrey Tang
 license:            PublicDomain
 license-file:       LICENSE
diff --git a/src/Network/Multicast.hsc b/src/Network/Multicast.hsc
--- a/src/Network/Multicast.hsc
+++ b/src/Network/Multicast.hsc
@@ -30,6 +30,7 @@
 import Foreign.Storable
 import Foreign.Marshal
 import Foreign.Ptr
+import Control.Exception (bracketOnError)
 
 type TimeToLive = Int
 type LoopbackMode = Bool
@@ -72,18 +73,22 @@
 -- >         print (msg, addr) in loop
 --
 multicastReceiver :: HostName -> PortNumber -> IO Socket
-multicastReceiver host port = do
-    proto <- getProtocolNumber "udp"
-    sock  <- socket AF_INET Datagram proto
-#ifdef SO_REUSEPORT
-    setSocketOption sock ReusePort 1
+multicastReceiver host port = bracketOnError get close setup
+  where
+    get = do
+      proto <- getProtocolNumber "udp"
+      sock  <- socket AF_INET Datagram proto
+#if defined(SO_REUSEPORT) && ! defined (__linux__)
+      setSocketOption sock ReusePort 1
 #else
-    setSocketOption sock ReuseAddr 1
+      setSocketOption sock ReuseAddr 1
+      return sock
 #endif
-    (addrInfo:_) <- getAddrInfo Nothing (Just host) (Just $ show port)
-    bindSocket sock $ addrAddress addrInfo
-    addMembership sock host
-    return sock
+    setup sock = do
+      (addrInfo:_) <- getAddrInfo Nothing (Just host) (Just $ show port)
+      bindSocket sock $ addrAddress addrInfo
+      addMembership sock host
+      return sock
 
 doSetSocketOption :: Storable a => CInt -> Socket -> a -> IO CInt
 doSetSocketOption ip_multicast_option (MkSocket s _ _ _ _) x = alloca $ \ptr -> do
