|
BOOL ReadStream( |
|
SOCKET hSocket, |
|
|
LPVOID lpvBuffer, |
|
|
LPDWORD lpdwLength, |
|
|
DWORD dwOptions, |
|
|
LPBYTE lpMarker, |
|
|
DWORD cbMarker |
|
); |
BOOL ReadStream( |
|
LPVOID lpvBuffer, |
|
|
LPDWORD lpdwLength, |
|
|
DWORD dwOptions, |
|
|
LPBYTE lpMarker, |
|
|
DWORD cbMarker |
|
); |
Read a stream of data from the client and store it in the specified
buffer.
Parameters
- hSocket
- An optional parameter that specifies the handle to the client socket.
If this parameter is omitted, the socket handle for the active
client session will be used. If this method is called outside of a
server event handler, the socket handle must be specified.
- lpvBuffer
- Pointer to the buffer that will contain or reference the data
when the method returns. The actual argument depends on the value
of the dwOptions parameter which specifies how the data
stream will be stored.
- lpdwLength
- A pointer to an unsigned integer value which specifies the
maximum length of the buffer and contains the number of bytes read
when the method returns. This argument should should always point
to an initialized value. If the lpvBuffer argument specifies a
memory buffer, then this argument cannot point to an initialized
value of zero; if any other type of stream buffer is used and the
initialized value is zero, that indicates that all available data
from the socket should be returned until the end-of-stream marker
is encountered or the remote host disconnects.
- dwOptions
- An unsigned integer value which specifies both the stream
buffer type and any options to be used when reading the data
stream. One of the following stream types may be specified:
Constant |
Description |
INET_STREAM_DEFAULT |
The default stream buffer type is determined by the value
passed as the lpvBuffer parameter. If the argument
specifies a pointer to a global memory handle initialized to
NULL, then the method will return a handle which references
the data; otherwise, the method will consider the parameter a
pointer to a block of pre-allocated memory which will contain
the stream data when the method returns. In most cases, it is
recommended that an application explicitly specify the stream
buffer type rather than using the default value. |
INET_STREAM_MEMORY |
The lpvBuffer argument specifies a pointer to a
pre-allocated block of memory which will contain the data
read from the socket when the method returns. If this stream
buffer type is used, the lpdwLength argument must
point to an unsigned integer which has been initialized with
the maximum length of the buffer. |
INET_STREAM_HGLOBAL |
The lpvBuffer argument specifies a pointer to a
global memory handle. When the method returns, the handle
will reference a block of memory that contains the stream
data. The application should take care to make sure that the
handle passed to the method does not currently reference a
valid block of memory; it is recommended that the handle be
initialized to NULL prior to calling this method. |
INET_STREAM_HANDLE |
The lpvBuffer argument specifies a Windows handle
to an open file, console or pipe. This should be the same
handle value returned by the CreateFile function in the
Windows API. The data read from the socket will be written to
this handle using the WriteFile function. |
INET_STREAM_SOCKET |
The lpvBuffer argument specifies a socket handle.
The data read from the socket specified by the hSocket
argument will be written to this socket. The socket handle
passed to this method must have been created by this library;
if it is a socket created by an third-party library or
directly by the Windows Sockets API, you should either create
another instance of the class and attach the socket using the
AttachHandle method or use the INET_STREAM_HANDLE stream
buffer type instead. |
- In addition to the stream buffer types listed above, the
dwOptions parameter may also have one or more of the
following bit flags set. Programs should use a bitwise operator
to combine values.
Constant |
Description |
INET_STREAM_CONVERT |
The data stream is considered to be textual and will be
modified so that end-of-line character sequences are
converted to follow standard Windows conventions. This will
ensure that all lines of text are terminated with a
carriage-return and linefeed sequence. Because this option
modifies the data stream, it should never be used with binary
data. Using this option may result in the amount of data
returned in the buffer to be larger than the source data. For
example, if the source data only terminates a line of text
with a single linefeed, this option will have the effect of
inserting a carriage-return character before each
linefeed. |
INET_STREAM_UNICODE |
The data stream should be converted to Unicode. This
option should only be used with text data, and will result in
the stream data being returned as 16-bit wide characters
rather than 8-bit bytes. The amount of data returned will be
twice the amount read from the source data stream; if the
application is using a pre-allocated memory buffer, this must
be considered before calling this method. |
- lpMarker
- A pointer to an array of bytes which marks the end of the
data stream. When this byte sequence is encountered by the
method, it will stop reading and return to the caller. The buffer
will contain all of the data read from the socket up to and
including the end-of-stream marker. If this argument is NULL,
then the method will continue to read from the socket until the
maximum buffer size is reached, the remote host closes its socket
or an error is encountered.
- cbMarker
- An unsigned integer value which specifies the length of the
end-of-stream marker in bytes. If the lpMarker parameter
is NULL, then this value must be zero.
Return Value
If the method succeeds, the return value is non-zero. If the
method fails, the return value is zero. To get extended error
information, call GetLastError.
Remarks
The ReadStream method enables an application to read an
arbitrarily large stream of data and store it in memory, write it
to a file or even another socket. Unlike the Read method,
which will return immediately when any amount of data has been
read, ReadStream will only return when the buffer is full as
specified by the lpdwLength parameter, the logical
end-of-stream marker has been read, the socket closed by the remote
host or when an error occurs. This method will force the session
thread to block until the operation completes.
It is possible for data to be returned in the buffer even if the
method returns a value of zero. Applications should also check the
value of the lpdwLength argument to determine if any data
was copied into the buffer. For example, if a timeout occurs while
the method is waiting for more data to arrive on the socket, it
will return zero; however, data may have already been copied into
the buffer prior to the error condition. It is the responsibility
of the application to process that data, regardless of the method
return value.
Example
HGLOBAL hgblBuffer = NULL; // Return data in a global memory buffer
DWORD cbBuffer = 102400; // Read up to 100K bytes
BOOL bResult;
bResult = pServer->ReadStream(&hgblBuffer, &cbBuffer,
INET_STREAM_HGLOBAL | INET_STREAM_CONVERT);
if (bResult && cbBuffer > 0)
{
LPBYTE lpBuffer = (LPBYTE)GlobalLock(hgblBuffer);
// Use data in the stream buffer
GlobalUnlock(hgblBuffer);
GlobalFree(hgblBuffer);
}
Requirements
Minimum Desktop Platform: Windows 7 (Service Pack 1)
Minimum Server Platform: Windows Server 2008 R2 (Service Pack 1)
Header: Include cswsock10.h
Import Library: cswskv10.lib
See Also
GetStreamInfo, Read, ReadLine,
StoreStream, Write, WriteLine,
WriteStream
|
|