Douglas C. Schmidt
schmidt at dre.vanderbilt.edu
Tue Jul 10 14:31:23 CDT 2007
>On 7/9/07, Albert Sanchez <ouferrat at gmail.com> wrote:
>> How can I know after recv() how many bytes were actually received and if
>> there's still something to receive??
>If I'm not mistaken, you provide recv () with a pointer to the buffer
>and the buffer size you want the fresh data to be stored in, and it
>returns the amount of bytes.
That's correct. Here's the documentation from ACE_ROOT/ace/SOCK_IO.h:
* @class ACE_SOCK_IO
* @brief Defines the methods for the ACE socket wrapper I/O routines
* (e.g., send/recv).
* If @a timeout == 0, then the call behaves as a normal
* send/recv call, i.e., for blocking sockets, the call will
* block until action is possible; for non-blocking sockets,
* -1 will be returned with errno == EWOULDBLOCK if no action is
* immediately possible.
* If @a timeout != 0, the call will wait until the relative time
* specified in *@a timeout elapses.
* Errors are reported by -1 and 0 return values. If the
* operation times out, -1 is returned with <errno == ETIME>.
* If it succeeds the number of bytes transferred is returned.
* Methods with the extra <flags> argument will always result in
* <send> getting called. Methods without the extra <flags>
* argument will result in <send> getting called on Win32
* platforms, and <write> getting called on non-Win32 platforms.
> The best way to see whether a socket still has data available is to
> use a select ()-based event handling system, such as the Reactor. If
> an event arrives on the socket, and you have read 0 or -1 bytes, you
> know that the connection has been/should be closed.
Right! Please see Chapter 3 and 4 of C++NPv2
<www.cs.wustl.edu/~schmidt/ACE/book2/> for more details and examples.
Dr. Douglas C. Schmidt Professor and Associate Chair
Electrical Engineering and Computer Science TEL: (615) 343-8197
Vanderbilt University WEB: www.dre.vanderbilt.edu/~schmidt
Nashville, TN 37203 NET: d.schmidt at vanderbilt.edu
More information about the Ace-users