module Net (listenSocket) where
import Control.Exception
import Network
import Network.BSD
import Network.Socket
listenSocket :: String -> IO Socket
listenSocket serv = do
proto <- getProtocolNumber "tcp"
let hints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_PASSIVE]
, addrSocketType = Stream
, addrProtocol = proto }
addrs <- getAddrInfo (Just hints) Nothing (Just serv)
let addrs' = filter (\x -> addrFamily x == AF_INET6) addrs
addr = head $ if null addrs' then addrs else addrs'
listenSocket' addr
listenSocket' :: AddrInfo -> IO Socket
listenSocket' addr = bracketOnError setup cleanup $ \sock -> do
setSocketOption sock ReuseAddr 1
setSocketOption sock NoDelay 1
bindSocket sock (addrAddress addr)
listen sock 2048
return sock
where
setup = socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
cleanup = sClose