| 1234567891011121314151617181920212223242526272829303132333435363738 | {-# LANGUAGE TypeSynonymInstances #-}module Network.UDP( DataPacket(..), openBoundUDPPort, openListeningUDPPort, pingUDPPort, sendUDPPacketTo, recvUDPPacket, recvUDPPacketFrom) whereimport qualified Data.ByteString as Strict (ByteString, concat, singleton)import qualified Data.ByteString.Lazy as Lazy (ByteString, toChunks, fromChunks)import Data.ByteString.Char8 (pack, unpack)import Network.Socket hiding (sendTo, recv, recvFrom)import Network.Socket.ByteString (sendTo, recv, recvFrom)-- Type class for converting StringLike types to and from strict ByteStringsclass DataPacket a where  toStrictBS :: a -> Strict.ByteString  fromStrictBS :: Strict.ByteString -> ainstance DataPacket Strict.ByteString where  toStrictBS = id  {-# INLINE toStrictBS #-}  fromStrictBS = id  {-# INLINE fromStrictBS #-}openBoundUDPPort :: String -> Int -> IO SocketopenBoundUDPPort uri port = do  s <- getUDPSocket  bindAddr <- inet_addr uri  let a = SockAddrInet (toEnum port) bindAddr  bindSocket s a  return spingUDPPort :: Socket -> SockAddr -> IO ()pingUDPPort s a = sendTo s (Strict.singleton 0) a >> return ()
 |