If the function succeeds, the return value is the number of bytes
actually read. A return value of zero indicates that the remote host
has closed the connection and there is no more data available to be
read. If the function fails, the return value is INET_ERROR. To get
extended error information, call InetGetLastError.
The InetRead function will read up to the specified number of
bytes and store the data in the buffer provided by the caller. If
there is no data available to be read at the time this function is
called, the current thread will block until at least one byte of data
becomes available, the timeout period elapses or an error occurs. This
function will return if any amount of data is sent by the remote host, and
will not block until the entire buffer has been filled. To avoid
blocking the current thread, either create an asynchronous socket or
use the InetIsReadable function to determine if there is data
available to be read prior to calling this function.
The application should never make an assumption about the amount of
data that will be available to read. TCP considers all data to be an
arbitrary stream of bytes and does not impose any structure on the
data itself. For example, if the remote host is sending data to the server
in fixed 512 byte blocks of data, it is possible that a single call to
the Read function will return only a partial block of data, or it
may return multiple blocks combined together. It is the responsibility
of the application to buffer and process this data appropriately.
For applications that are built using the Unicode character set, it
is important to note that the buffer is an array of bytes, not
characters. If the remote host is writing string data to the socket, it
must be read as a stream of bytes and converted using the
MultiByteToWideChar function. If the remote host is sending lines of
text terminated with a linefeed or carriage return and linefeed pair,
the InetReadLine function will return a line of text at a time and
perform this conversion for you.
When InetRead is called and the socket is in non-blocking
mode, it is possible that the function will fail because there is no
available data to read at that time. This should not be considered a
fatal error. Instead, the application should simply wait to receive
the next asynchronous notification that data is available.