1import Network.Transport
2import Network.Transport.TCP (createTransport)
3import Control.Concurrent
5import Control.Exception
6import System.Environment
8-- | Server that echoes messages straight back to the origin endpoint.
9echoServer :: EndPoint -> MVar () -> IO ()
10echoServer endpoint serverDone = go empty
12 go :: Map ConnectionId (MVar Connection) -> IO ()
14 event <- receive endpoint
16 ConnectionOpened cid rel addr -> do
17 connMVar <- newEmptyMVar
19 Right conn <- connect endpoint addr rel
21 go (insert cid connMVar cs)
22 Received cid payload -> do
24 conn <- readMVar (cs ! cid)
28 ConnectionClosed cid -> do
30 conn <- readMVar (cs ! cid)
34 putStrLn "Echo server exiting"
37onCtrlC :: IO a -> IO () -> IO a
38p `onCtrlC` q = catchJust isUserInterrupt p (const $ q >> p `onCtrlC` q)
40 isUserInterrupt :: AsyncException -> Maybe ()
41 isUserInterrupt UserInterrupt = Just ()
42 isUserInterrupt _ = Nothing
46 [host, port] <- getArgs
47 serverDone <- newEmptyMVar
48 Right transport <- createTransport host port
49 Right endpoint <- newEndPoint transport
50 forkIO $ echoServer endpoint serverDone
51 putStrLn $ "Echo server started at " ++ show (address endpoint)
52 readMVar serverDone `onCtrlC` closeTransport transport
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list