packages feed

network-multicast 0.0.1 → 0.0.2

raw patch · 4 files changed

+53/−23 lines, 4 filesdep ~network

Dependency ranges changed: network

Files

+ examples/receiver.hs view
@@ -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
+ examples/sender.hs view
@@ -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
network-multicast.cabal view
@@ -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
src/Network/Multicast.hsc view
@@ -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