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 +11/−0
- examples/sender.hs +16/−0
- network-multicast.cabal +11/−5
- src/Network/Multicast.hsc +15/−18
+ 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