[ee122] recv() and read() buffer length question
Daniel Killebrew
dank at eecs.berkeley.edu
Sun Sep 23 21:04:40 PDT 2007
Niels Joubert wrote:
> Hello all!
>
> I'm running into a conceptual problem with read and recv in terms of the
> buffer you pass it. If i understand sockets correctly, the chain of
> events is somthing like this:
>
> Server app calls send - > data goes to kernel buffer -> data gets
> transmitted -> data gets assembled into kernel buffer -> client calls
> read with a buffer to be filled up.
>
> So far we've been handing read and/or recv() a fixed length buffer. Recv
> then returns with the amount of bytes filled into this buffer. If the
> buffer you hand it is bigger than the amount of data in the kernel
> buffer, its all good. what is there is more data in the kernel than the
> buffer you handit can take? how do you know to read more data to get the
> whole request?
>
You call read() again. Also, if you are using select(), next time you
call it, it should return immediately, telling you that the socket is
ready to read from.
> For example, if the server is sending a 1 Mbyte file, and you have a
> little 2048 bytes big buffer in your client. you have to know to keep on
> reading 2048 bytes and doing something with it until there is no data
> left from the server. How do you do this? The only way i've found is to
> use non-blocking IO and watch the errno for a message saying that there
> is no data to be read.
You can use select() with a timeout of 0 (essentially nonblocking IO).
> Or should you purely rely on your own identifiers
> to mark the end of a transmission of something like a file?
>
That works too.
Daniel
> Thanks!
>
> -Niels
> _______________________________________________
> ee122 mailing list
> ee122 at mailman.ICSI.Berkeley.EDU
> http://mailman.ICSI.Berkeley.EDU/mailman/listinfo/ee122
>
>
More information about the ee122
mailing list