1234567891011121314151617181920212223242526272829303132333435363738 |
- {-# LANGUAGE TypeSynonymInstances #-}
- module Network.UDP
- ( DataPacket(..)
- , openBoundUDPPort
- , openListeningUDPPort
- , pingUDPPort
- , sendUDPPacketTo
- , recvUDPPacket
- , recvUDPPacketFrom
- ) where
- import 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 ByteStrings
- class DataPacket a where
- toStrictBS :: a -> Strict.ByteString
- fromStrictBS :: Strict.ByteString -> a
- instance DataPacket Strict.ByteString where
- toStrictBS = id
- {-# INLINE toStrictBS #-}
- fromStrictBS = id
- {-# INLINE fromStrictBS #-}
- openBoundUDPPort :: String -> Int -> IO Socket
- openBoundUDPPort uri port = do
- s <- getUDPSocket
- bindAddr <- inet_addr uri
- let a = SockAddrInet (toEnum port) bindAddr
- bindSocket s a
- return s
- pingUDPPort :: Socket -> SockAddr -> IO ()
- pingUDPPort s a = sendTo s (Strict.singleton 0) a >> return ()
|