一応動いてるように見えるけどネットワークプログラミングの理解が中途半端なので全うに動いているわけではないかもしれない。あとHaskellぽいインデントとかのコーディング規約みたいなものがよくわかっていない。あとで誰かに読んでもらって感想を聞こう。
#!runghc -v1 import Control.Concurrent import Data.Char (toUpper, toLower) import Network import System.Exit import System.IO main :: IO () main = withSocketsDo $ do socket <- listenOn (PortNumber 10002) waitAccept socket sClose socket waitAccept :: Socket -> IO () waitAccept socket = do (h, hostName, _) <- accept socket hSetBuffering h NoBuffering putStrLn $ "from: " ++ hostName forkIO $ echoLoop h uc waitAccept socket echoLoop :: Handle -> (String -> String) -> IO () echoLoop h f = do hEOF <- hIsEOF h if hEOF then exitWith ExitSuccess else do hPutStrLn h . f =<< hGetLine h echoLoop h f uc :: String -> String uc [] = [] uc (x:xs) = toUpper x : uc xs camel :: String -> String camel [] = [] camel (x:xs) = toUpper x : map toLower xs
#!runghc -v1 import Network import System.Exit import System.IO main :: IO () main = withSocketsDo $ do h <- connectTo "localhost" (PortNumber 10002) hSetBuffering h NoBuffering loop h hClose h loop :: Handle -> IO () loop h = do eof <- isEOF if eof then exitWith ExitSuccess else do getLine >>= hPutStrLn h hGetLine h >>= putStrLn loop h