Haskellでソケットプログラミング

Haskellでソケットプログラミングをやってみる。


お試しで書いた時刻を返すだけの簡単なサーバ。

-- DateServer.sh --
module Main where

import System.IO
import System.Time
import System.Environment (getArgs)
import Network

-- 接続してきたクライアントに時刻を返して終了
main :: IO ()
main = do
    args <- getArgs
    let
        port = fromIntegral $ (read (head args) :: Integer)

    withSocketsDo $ do 
        serverSocket <- listenOn (PortNumber port)
        (clientHandle, clientHost, clientPort) <- accept serverSocket
        nowTime <- getClockTime        

        hSetBuffering clientHandle NoBuffering
        hPutStrLn clientHandle $ show nowTime


PortNumber型のコンストラクタに渡す値は
fromIntegralで変換した値じゃないとなぜかうまくいかない。。。
何気にそこが一番はまった。


ビルドして実行。

C:\work\haskell\SockTest\DateServer>ghc DateServer.hs

C:\work\haskell\SockTest\DateServer>DateServer.exe 8001


WindowsXPのtelnetコマンドから接続。

C:\Documents and Settings\miya0001>telnet localhost 8001
Thu Feb 28 00:46:57 東京 (標準時) 2013


ホストとの接続が切断されました。


withSocketsDo関数のソースを見ると
引数の関数?の実行が終わったあとに
socketをクローズしてくれるようだ。


とりあえず今日はここまで。