On Tue, 03 Nov 2009 20:05:17 -0500, Zane <[email protected]> wrote:

I assumed since the underlying TcpSocket was blocking, then calling read through the stream would also block....dunno. Anyway, so if I were to use a loop, how could I do this with read? The size of the read buffer must be initialized before the reading takes place, however, I do not know how much will be read for the next "chunk". If I am to receive these in arbitrarily sized chunks for concatenation, I don't see a sensible way of constructing a loop. Example?

Your interpretation of blocking sockets is incorrect. A socket blocks on a read only if *no* data is available. If any data is available, it reads as much as it can and returns.

A non blocking socket returns immediately, even if no data is available (usually returning an error like EAGAIN).

A simple loop (keep in mind, I don't know phobos, and I didn't look up the exact usage):

// ubyte[] buf is the array we want to fill, predetermined length

ubyte[] tmp = buf[];

while(tmp.length > 0)
{
  auto bytesread = socket.read(tmp);
if(bytesread == 0) break; // EOF (also should check for error here if necessary)
  tmp = tmp[bytesread..$];
}

This kind of thing can *easily* be put into a wrapper function.

-Steve

Reply via email to