[Haskell-cafe] Simple network client

Timo B. Hübel t.h at gmx.info
Tue Jan 29 06:12:01 EST 2008


I am using the very simple interactTCP example from [1] to play around with 
Haskell network programming but I just can't get a simple client for that 
example to work (it works like a charm with my telnet client, as described in 
the article). 

This is what I am trying to do with the client:

  main = withSocketsDo $ do
         hdl <- connectTo "localhost" (PortNumber 1234)
         hSetBuffering hdl NoBuffering
         hPutStr hdl "test message"
         res <- hGetContents hdl
         putStrLn (show res)

The server looks like this:

  interactTCP :: Int -> (String -> IO String) -> IO ()
  interactTCP port f = withSocketsDo $ do
          servSock <- listenOn $ PortNumber (fromIntegral port)
          waitLoop f servSock

  waitLoop f servSock = do
          bracket (fmap (\(h,_,_)->h) $ accept servSock)
                  (\h -> do
                          hSetBuffering h NoBuffering
                          hGetContents h >>= f >>= hPutStr h)
          waitLoop f servSock

  main = interactTCP 1234 (return . map toUpper)

But is seems as some deadlocking occurs. Both programs just hang around doing 
nothing. By inserting some debug output I was able to make sure that the 
client successfully connects, but the data interchange just does not start. 
Because the whole thing works using telnet, I suspect that I am doing 
something fundamentally wrong in the client ...

Any hints are greatly appreciated.



More information about the Haskell-Cafe mailing list