module Util.Net (listenOnLocalhost, listenOnLocalhostAnyPort) where
import Network hiding (socketPort)
import Network.Socket hiding (sClose, PortNumber)
import Network.BSD (getProtocolNumber)
import Control.Exception (bracketOnError)
listenOnLocalhost (PortNumber port) = do
proto <- getProtocolNumber "tcp"
localhost <- inet_addr "127.0.0.1"
bracketOnError
(socket AF_INET Stream proto)
(sClose)
(\sock -> do
setSocketOption sock ReuseAddr 1
bindSocket sock (SockAddrInet port localhost)
listen sock maxListenQueue
return sock
)
listenOnLocalhostAnyPort = do
proto <- getProtocolNumber "tcp"
localhost <- inet_addr "127.0.0.1"
bracketOnError
(socket AF_INET Stream proto)
(sClose)
(\sock -> do
setSocketOption sock ReuseAddr 1
bindSocket sock (SockAddrInet aNY_PORT localhost)
listen sock maxListenQueue
port <- socketPort sock
return (sock, port)
)