Re: change function
"Larry" <dontmewithme@got.it> ha scritto nel messaggio
news:4b637617$0$820$4fafbaef@reader5.news.tin.it...
this is what I have figure out so far: (untested)
#include <algorithm>
int Socket::ReceiveBytes(char * buffer, int buffersize)
{
if(buffersize > 32768)
buffersize = 32768;
char temp[32768];
u_long arg = 0;
if (ioctlsocket(s_, FIONREAD, &arg) != 0)
return -1;
if (arg == 0)
return 0;
if (arg > buffersize)
arg = buffersize;
int rv = recv (s_, temp, arg, 0);
if (rv <= 0)
return -1;
if (rv == 0)
return 0;
if (rv > 0)
std::copy(temp, temp + rv, buffer);
}
where FIONREAD:
Determine the amount of data which can be read atomically from socket s.
argp points to an unsigned long in which ioctlsocket stores the result. If s
is stream oriented (for example, type SOCK_STREAM), FIONREAD returns an
amount of data which can be read in a single recv; this may or may not be
the same as the total amount of data queued on the socket. If s is message
oriented (for example, type SOCK_DGRAM), FIONREAD returns the size of the
first datagram (message) queued on the socket.
So I basically I will recv according to ioctlsocket. if the latter is > then
buffersize I will read buffersize (arg = buffersize) if it's
less...well...be just happy with that...if it's 0 or less don't even bother
copying the buffer and return accordingly.
that's all
what about my idea?
thanks