Sockets again

Keean Schupke
Tue, 29 Apr 2003 18:22:24 +0100

You could try using lazy reading instead. Someting Like:

module Main(main) where

import IO
import Network

main = do
   socket <- listenOn (PortNumber 15151)
   (handle,hostName,_) <- accept socket
   hSetBuffering handle (BlockBuffering (Just 4096))
   putStr ("Accepted: "++hostName++"\n")
   (c:_) <- hGetContents handle
   putStrLn (show c)

    Keean Schupke

George Russell wrote:

> Simon Marlow wrote (snipped)
>> Hmm.  I rather think that hGetChar should always return a character
>> immediately if there is one available, regardless of the buffering mode.
>> Looking at the source, it appears that hGetLine behaves like this, as
>> does lazy reading with hGetContents.  I can't see any reason for waiting
>> for the buffer to be completely full before returning anything.
>> If you have a source tree handy, try the enclosed patch.  If not, make a
>> copy of hGetChar from the sources in libraries/base/GHC/IO.hs, apply the
>> patch, and compile it separately (you'll need to import GHC.Handle
>> explicitly, amongst other things).
> OK, applying the patch and dropping the patched hGetChar in (as per 
> the attached
> file) seems to fix the problem.   Is there any way of getting the same 
> effect
> without setting NoBuffering/waiting for the next ghc release/changing 
> every
> call by client and server to hGetChar in the program?  If not I think 
> I'll
> keep NoBuffering and wait for the next ghc release ..
> Thanks,
> George