diff --git a/examples/receiver.hs b/examples/receiver.hs
new file mode 100644
--- /dev/null
+++ b/examples/receiver.hs
@@ -0,0 +1,11 @@
+import Network.Socket (withSocketsDo, recvFrom)
+import Network.Multicast (multicastReceiver)
+
+main :: IO ()
+main = withSocketsDo $ do
+    sock <- multicastReceiver "224.0.0.99" 9999
+    let loop = do
+        (msg, _, addr) <- recvFrom sock 1024
+        putStrLn $ "Recv [" ++ show addr ++ "]: " ++ msg
+        loop
+    loop
diff --git a/examples/sender.hs b/examples/sender.hs
new file mode 100644
--- /dev/null
+++ b/examples/sender.hs
@@ -0,0 +1,16 @@
+import Network.Socket (withSocketsDo, sendTo)
+import Network.Multicast (multicastSender, noLoopback)
+
+import System.Time (getClockTime)
+import Control.Concurrent (threadDelay)
+
+main :: IO ()
+main = withSocketsDo $ do
+    (sock, addr) <- multicastSender "224.0.0.99" 9999 noLoopback
+    let loop = do
+        msg <- fmap show getClockTime
+        sendTo sock msg addr
+        putStrLn $ "Send [" ++ show addr ++ "]: " ++ msg
+        threadDelay 100000
+        loop
+    loop
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.1
+version:            0.0.2
 copyright:          2008 Audrey Tang
 license:            BSD3
 license-file:       LICENSE
@@ -10,8 +10,14 @@
                     UDP datagrams over multicast (class D) addresses.
 stability:          experimental
 build-type:         Simple
-extensions:         ForeignFunctionInterface
-exposed-modules:    Network.Multicast
-build-depends:      base, network
 category:           Network
-hs-source-dirs:     src
+cabal-version:      >= 1.2
+extra-source-files: examples/sender.hs examples/receiver.hs
+
+library
+    extensions:         ForeignFunctionInterface, CPP
+    exposed-modules:    Network.Multicast
+    build-depends:      base, network
+    hs-source-dirs:     src
+    if os(win32)
+        extra-libraries: ws2_32
diff --git a/src/Network/Multicast.hsc b/src/Network/Multicast.hsc
--- a/src/Network/Multicast.hsc
+++ b/src/Network/Multicast.hsc
@@ -12,8 +12,7 @@
 -- (class D) addresses.
 --
 -----------------------------------------------------------------------------
-#include <sys/types.h>
-#include <netinet/in.h>
+#include <HsNet.h>
 
 module Network.Multicast (
     -- * Simple sending and receiving
@@ -53,15 +52,11 @@
 multicastSender :: HostName -> PortNumber -> LoopbackMode -> IO (Socket, SockAddr)
 multicastSender host port loop = do
     proto <- getProtocolNumber "udp"
-    let hints = defaultHints
-            { addrFlags      = [AI_ADDRCONFIG]
-            , addrProtocol   = proto
-            , addrSocketType = Datagram
-            }
-    (addr:_) <- getAddrInfo (Just hints) (Just host) (Just $ show port)
-    sock     <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
+    sock  <- socket AF_INET Datagram proto
     if loop then return () else setLoopbackMode sock loop
-    return (sock, addrAddress addr)
+    host  <- inet_addr host
+    let addr = SockAddrInet port host
+    return (sock, addr)
 
 -- | Calling 'multicastReceiver' creates and binds a UDP socket for listening
 -- multicast datagrams on the specified host and port.
@@ -79,16 +74,14 @@
 multicastReceiver :: HostName -> PortNumber -> IO Socket
 multicastReceiver host port = do
     proto <- getProtocolNumber "udp"
-    let hints = defaultHints
-            { addrFlags      = [AI_PASSIVE]
-            , addrProtocol   = proto
-            , addrSocketType = Datagram
-            }
-    (addr:_) <- getAddrInfo (Just hints) (Just host) (Just $ show port)
-    sock     <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
+    sock  <- socket AF_INET Datagram proto
     addMembership sock host
+#ifdef SO_REUSEPORT
     setSocketOption sock ReusePort 1
-    bindSocket sock (addrAddress addr)
+#endif
+    host  <- inet_addr host
+    let addr = SockAddrInet port host
+    bindSocket sock addr
     return sock
 
 -- | Enable or disable the loopback mode on a socket created by 'multicastSender'.
@@ -120,7 +113,11 @@
     #{poke struct ip_mreq, imr_interface} mReqPtr (#{const INADDR_ANY} `asTypeOf` addr)
     c_setsockopt s _IPPROTO_IP flag (castPtr mReqPtr) (#{size struct ip_mreq})
 
+#ifdef mingw32_HOST_OS
+foreign import stdcall unsafe "setsockopt"
+#else
 foreign import ccall unsafe "setsockopt"
+#endif
     c_setsockopt :: CInt -> CInt -> CInt -> Ptr CInt -> CInt -> IO CInt
 
 _IPPROTO_IP :: CInt
