|
52 | 52 | -- > , addrSocketType = Stream
|
53 | 53 | -- > }
|
54 | 54 | -- > head <$> getAddrInfo (Just hints) mhost (Just port)
|
55 |
| --- > open addr = do |
56 |
| --- > sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr) |
57 |
| --- > setSocketOption sock ReuseAddr 1 |
58 |
| --- > withFdSocket sock setCloseOnExecIfNeeded |
59 |
| --- > bind sock $ addrAddress addr |
60 |
| --- > listen sock 1024 |
61 |
| --- > return sock |
62 |
| --- > loop sock = forever $ do |
63 |
| --- > (conn, _peer) <- accept sock |
64 |
| --- > void $ forkFinally (server conn) (const $ gracefulClose conn 5000) |
| 55 | +-- > open addr = E.bracketOnError |
| 56 | +-- > (socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)) |
| 57 | +-- > close $ \sock -> do |
| 58 | +-- > setSocketOption sock ReuseAddr 1 |
| 59 | +-- > withFdSocket sock setCloseOnExecIfNeeded |
| 60 | +-- > bind sock $ addrAddress addr |
| 61 | +-- > listen sock 1024 |
| 62 | +-- > return sock |
| 63 | +-- > loop sock = forever $ E.bracketOnError (accept sock) (close . fst) |
| 64 | +-- > $ \(conn, _peer) -> void $ |
| 65 | +-- > forkFinally (server conn) (const $ gracefulClose conn 5000) |
65 | 66 | --
|
66 | 67 | -- > {-# LANGUAGE OverloadedStrings #-}
|
67 | 68 | -- > -- Echo client program
|
|
88 | 89 | -- > resolve = do
|
89 | 90 | -- > let hints = defaultHints { addrSocketType = Stream }
|
90 | 91 | -- > head <$> getAddrInfo (Just hints) (Just host) (Just port)
|
91 |
| --- > open addr = do |
92 |
| --- > sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr) |
93 |
| --- > connect sock $ addrAddress addr |
94 |
| --- > return sock |
| 92 | +-- > open addr = E.bracketOnError |
| 93 | +-- > (socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)) |
| 94 | +-- > close $ \sock -> do |
| 95 | +-- > connect sock $ addrAddress addr |
| 96 | +-- > return sock |
95 | 97 | --
|
96 | 98 | -- The proper programming model is that one 'Socket' is handled by
|
97 | 99 | -- a single thread. If multiple threads use one 'Socket' concurrently,
|
|
0 commit comments