module HSNTP.Util.UDP (connectUDP, listenUDP,
recvBufFrom, sendBufTo,
sockAddr, newSock, sClose
) where
import Data.Char
import Network.BSD
import Network.Socket
#if (__GLASGOW_HASKELL__ < 603)
import Data.Word
import Foreign.C.String
import Foreign.Marshal.Array
import Foreign.Ptr
recvBufFrom :: Socket -> Ptr Word8 -> Int -> IO (Int, SockAddr)
recvBufFrom sock ptr n = do (str,len,sa) <- recvFrom sock n
pokeArray ptr ((map (fromIntegral . ord) str) :: [Word8])
return (len,sa)
sendBufTo :: Socket -> Ptr Word8 -> Int -> SockAddr -> IO Int
sendBufTo sock ptr len sa = do str <- peekArray len ptr
sendTo sock (map (chr . fromIntegral) str) sa
#endif
connectUDP :: String -> Int -> IO Socket
connectUDP host port = do sock <- socket AF_INET Datagram 0
addr <- getHostByName host
connect sock $ SockAddrInet (toEnum port) $ hostAddress addr
return sock
sockAddr :: String -> Int -> IO SockAddr
sockAddr host port = do ha <- getHostByName host
return $ SockAddrInet (toEnum port) (hostAddress ha)
newSock :: IO Socket
newSock = socket AF_INET Datagram 0
listenUDP :: Int -> IO Socket
listenUDP port = do sock <- socket AF_INET Datagram 0
bindSocket sock $ SockAddrInet (toEnum port) iNADDR_ANY
return sock