CAsyncSocket datagram size confusion
Erik Heuer -- erik.heuer@ks-t.no
Thursday, October 03, 1996
Environment: Win NT 3.51, VC++ 4.1
I am using CAsyncSocket, reading from a SOCK_DGRAM socket which is being
broadcast to from other machines. In my OnReceive code I do this:
DWORD toread;
VERIFY(IOCtl(FIONREAD,&toread));
to see how big a buffer I need for the incoming datagram.
Despite what the CAsyncSocket:IOCtl() spec says:
FIONREAD Determine the maximum number of bytes that can be
read with one Receive call from this socket. ...[snip] ...
If this socket is of type SOCK_DGRAM, FIONREAD returns the
size of the first datagram queued on the socket.
I am experiencing (under high incoming datagram rates) that toread
contains the total queue size and not just the size of the first
datagram, such that the subsequent statement:
ASSERT((actualread = Receive(buff,toread)) == toread);
asserts, with actualread set to the datagram size.
Have you experienced this problem? Do you know any solution or workaround?
Thanks....
Erik Heuer, Kongsberg Simulation & Training, 3600 Kongsberg, Norway
E-mail: erik.heuer@ks-t.no Phone:(+47) 32735766 Fax:(+47) 32736965
Gabriel Parlea-Visalon -- Gabriel@derivs.demon.co.uk
Tuesday, October 08, 1996
In your message dated Thursday 3, October 1996 you wrote :
>
> Environment: Win NT 3.51, VC++ 4.1
>
> I am using CAsyncSocket, reading from a SOCK_DGRAM socket which is being
> broadcast to from other machines. In my OnReceive code I do this:
>
> DWORD toread;
> VERIFY(IOCtl(FIONREAD,&toread));
>
> to see how big a buffer I need for the incoming datagram.
> Despite what the CAsyncSocket:IOCtl() spec says:
>
> FIONREAD Determine the maximum number of bytes that can be
> read with one Receive call from this socket. ...[snip] ...
> If this socket is of type SOCK_DGRAM, FIONREAD returns the
> size of the first datagram queued on the socket.
>
> I am experiencing (under high incoming datagram rates) that toread
> contains the total queue size and not just the size of the first
> datagram, such that the subsequent statement:
>
> ASSERT((actualread = Receive(buff,toread)) == toread);
>
> asserts, with actualread set to the datagram size.
>
> Have you experienced this problem? Do you know any solution or workaround?
>
> Thanks....
> Erik Heuer, Kongsberg Simulation & Training, 3600 Kongsberg, Norway
> E-mail: erik.heuer@ks-t.no Phone:(+47) 32735766 Fax:(+47) 32736965
>
>
CAsyncSocket::Receive() entry in the Class Library Reference clearly says that
for datagram sockets, data is extracted from the first enqued datagram, up to
the size of the buffer supplied. The buffer need not necessarily be filled
entirely.
That is why your code asserts, as it should, if the buffer size is larger or
equal to the datagram size.
Rather than VERIFY() and ASSERT() it would be worth probably checking those
errors first, especilly if you expect high incoming datagram rates. There's a
handy function GetLastError() to retrieve them.
I hope this helps you.
Gabriel
--
Gabriel Parlea-Visalon
Software Engineer
Derivative Trading Systems
gabriel@derivs.demon.co.uk
| Вернуться в корень Архива
|