Fast I/O with sockets

Simon Marlow simonmar at microsoft.com
Tue Sep 16 14:45:47 EDT 2003


 
> I was wondering how to read and write from a Socket in the most
> performant way. According to the library documentation from GHC,
> 'hGetBuf' and 'hPutBuf' are the way to go. But my problem with these
> functions is that they expect to read exactly the number of bytes I
> gave them!
> 
> The IO computation
> 
>     hGetBuf sock ptr 1024
> 
> wants to read 1024 bytes, no less. This doesn't work for me, because I
> need to drive an interactive line-based protocol session. I need the
> read operation to consume as much data as is available and then to
> return immediately, so that I can process the command right away.
> 
> As an alternative, I looked at 'hGetLine', but this doesn't work for
> me either, at least not very well, because in my protocol, lines are
> terminated by "\r\n" -- not just "\n", like hGetLine expects it.

hGetLine should work fine, indeed that's what I used in the Haskell Web
Server.  Each line will have an extra '\r' at the end, but you just need
to allow for that.

We really should have non-blocking versions of hGetBuf and hPutBuf, and
in fact I have the code sitting in my tree.  I'll take a look and see if
it can be committed.

Cheers,
	Simon



More information about the Haskell-Cafe mailing list