| 1 | module Main where |
|---|
| 2 | import Control.Monad |
|---|
| 3 | import Control.Concurrent |
|---|
| 4 | import System.IO |
|---|
| 5 | import Control.Applicative |
|---|
| 6 | import Control.Exception (handle) |
|---|
| 7 | import System.Posix.Signals |
|---|
| 8 | import Network(listenOn, PortID(..)) |
|---|
| 9 | import Network.Socket |
|---|
| 10 | import System.IO |
|---|
| 11 | import System.IO.Error (isEOFError) |
|---|
| 12 | |
|---|
| 13 | sGetLine :: Socket -> IO String |
|---|
| 14 | sGetLine s = reverse <$> go [] |
|---|
| 15 | where go xs = do |
|---|
| 16 | (x,n) <- recvLen s 1 |
|---|
| 17 | if x == "\n" || n <= 0 |
|---|
| 18 | then return xs |
|---|
| 19 | else go $ x++xs |
|---|
| 20 | |
|---|
| 21 | listenSock :: Socket -> IO ThreadId |
|---|
| 22 | listenSock sk = forkIO . forever $ handle (\e -> print e) $ do |
|---|
| 23 | (resp,_) <- accept sk |
|---|
| 24 | forkIO . forever $ sGetLine resp >>= putStrLn |
|---|
| 25 | return () |
|---|
| 26 | |
|---|
| 27 | main :: IO () |
|---|
| 28 | main = do |
|---|
| 29 | installHandler sigPIPE Ignore Nothing |
|---|
| 30 | sk <- listenOn $ PortNumber 9020 |
|---|
| 31 | listenSock sk |
|---|
| 32 | forever $ threadDelay 1000000 |
|---|