on d06ca16 help sign in
35 lines 1.1 kB history raw
1module Util.Net (listenOnLocalhost, listenOnLocalhostAnyPort) where
3import Network hiding (socketPort)
4import Network.Socket hiding (sClose, PortNumber)
5import Network.BSD (getProtocolNumber)
6import Control.Exception (bracketOnError)
8-- Copied from upstream impl of listenOn
9-- bound to localhost interface instead of iNADDR_ANY
10listenOnLocalhost (PortNumber port) = do
11 proto <- getProtocolNumber "tcp"
12 localhost <- inet_addr "127.0.0.1"
13 bracketOnError
14 (socket AF_INET Stream proto)
15 (sClose)
16 (\sock -> do
17 setSocketOption sock ReuseAddr 1
18 bindSocket sock (SockAddrInet port localhost)
19 listen sock maxListenQueue
20 return sock
21 )
23listenOnLocalhostAnyPort = do
24 proto <- getProtocolNumber "tcp"
25 localhost <- inet_addr "127.0.0.1"
26 bracketOnError
27 (socket AF_INET Stream proto)
28 (sClose)
29 (\sock -> do
30 setSocketOption sock ReuseAddr 1
31 bindSocket sock (SockAddrInet aNY_PORT localhost)
32 listen sock maxListenQueue
33 port <- socketPort sock
34 return (sock, port)
35 )