module Arbor.Monad.UdpServer
( runUdpServer
, UdpHandler
) where
import Network.Socket
import qualified Data.ByteString as BS
import qualified Network.Socket.ByteString as BS
type UdpHandler = SockAddr -> BS.ByteString -> IO ()
runUdpServer :: ()
=> String -- ^ Port number or name; 514 is default
-> UdpHandler -- ^ Function to handle incoming messages
-> IO ()
runUdpServer port handler = withSocketsDo $ do
addrinfos <- getAddrInfo
(Just (defaultHints {addrFlags = [AI_PASSIVE]}))
Nothing (Just port)
let serveraddr = head addrinfos
sock <- socket (addrFamily serveraddr) Datagram defaultProtocol
bind sock (addrAddress serveraddr)
procMessages sock
where procMessages sock = do
(msg, addr) <- BS.recvFrom sock 1024
handler addr msg
procMessages sock