(Phobos - SocketStream) Am I doing something wrong or is this a bug?

Zane zane.sims at gmail.com
Tue Nov 3 17:05:17 PST 2009


BCS Wrote:

> Hello Zane,
> 
> > BCS Wrote:
> > 
> >> Hello Zane,
> >> 
> >>> While trying to learn sockets in Phobos, I ran into a problem.  I
> >>> was trying to download the google logo via an HTTP GET.  when I do a
> >>> socketStream.read, the returned "bytes read" value indicates that
> >>> less bytes were read in than were available (4097 bytes to be
> >>> exact).  The google logo is 8558 bytes in size as indicated by the
> >>> HTTP headers received.  Here is my code:
> >>> 
> >> The network connection might not have all the data yet. Try calling
> >> it in a loop kind of like your header reading code.
> >> 
> > I do not see how this can be the case.  Per the Phobos spec for
> > InputStream, "Read a block of data big enough to fill the given array
> > buffer. "  This sounds to me like it should do just that, fill my
> > array....and not return until done.  readLine needs to be looped
> > because it only reads up to a carriage return / newline combination
> > (and there are multiple lines).  Can anyone confirm that my
> > speculations are correct?  Otherwise, the documentation seems
> > misleading and I will need help with a correct implementation.
> 
> If I were you, I'd just try the looped version because there might be a bug. 
> I seem to recall that the stream stuff in some places gets defined to return 
> on out of data conditions. (BTW this would be consistent with the liked named 
> "read" function from posix.)
> 
> Looking into the code (Stream.read() and SocketStream.readBlock()) it doesn't 
> block if there isn't enough data. 
> 
> If this is a code bug or a documentation deficiency is another question.
> 
> 

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?

Zane



More information about the Digitalmars-d mailing list