Hi Haskell Cafe,
import Control.Concurrentimport Control.Exceptionimport Control.Monadimport Networkimport Offsync.Dataimport System.IOimport System.IO.Error (isEOFError)main = withSocketsDo $ dosListen <- listenOn (PortNumber 8000)putStrLn "Listening on Port 8000"forkIO $ forever $ do(sSession, hostname, port) <- accept sListenputStrLn ("Connected to " ++ hostname ++ ":" ++ show port)forkIO $ echoLines sSessionputStrLn "Press <CTRL-D> to quit."exitOnCtrlDechoLines h = try (hGetLine h) >>= either(\e -> do { hClose h; if isEOFError e then print e else ioError e})(\l -> do { hPutStrLn h l; hFlush h; echoLines h})exitOnCtrlD = try getLine >>= either(\e -> unless (isEOFError e) $ ioError e)(const exitOnCtrlD)
import Control.Concurrentimport Control.Exceptionimport Control.Monadimport Control.Monad.Transimport Data.IterIOimport Data.IterIO.Inumimport Networkimport System.IOimport System.IO.Error (isEOFError)import qualified Data.ByteString.Lazy as LiterHandle' :: (MonadIO m) => Handle -> IO (Iter L.ByteString m (), Onum L.ByteString m a)iterHandle' = iterHandlemain = withSocketsDo $ dosListen <- listenOn (PortNumber 8000)putStrLn "Listening on Port 8000"forkIO $ forever $ do(sSession, hostname, port) <- accept sListenputStrLn ("Connected to " ++ hostname ++ ":" ++ show port)forkIO $ do(iter, enum) <- iterHandle' sSessionenum |$ iterreturn ()putStrLn "Press <CTRL-D> to quit."exitOnCtrlDexitOnCtrlD = try getLine >>= either(\e -> unless (isEOFError e) $ ioError e)(const exitOnCtrlD)