Reading and Writing Asynchronously

ISAPI supports asynchronous I/O operations in three ways. First, your extension can write to the client asynchronously by calling the WriteClient callback function with the dwReserved parameter set to HSE_IO_ASYNC. Your extension can read from the client asynchronously by calling the ServerSupportFunction callback function with the dwHSERequest parameter set to HSE_REQ_ASYNC_READ_CLIENT. Finally, your extension can utilize the Win32® TransmitFile function to transmit a file quickly using the Winsock socket handle. To use TransmitFile, your extension calls the ServerSupportFunction with the dwHSERequest parameter set to HSE_REQ_TRANSMIT_FILE.

The following code establishes an asynchronous reading from a client.

DWORD
DoAsyncRC(
LPEXTENSION_CONTROL_BLOCK pecb
)
{
    char    szHeader[256] = "";
    BOOL    fReturn = TRUE;
    DWORD   dwFlags;
    DWORD   cbTotalToRead = MAX_BUF_SIZE;
    DWORD   hseStatus = HSE_STATUS_PENDING;
 
    //
    // Initialize the context for ReadClient
    //
 
    pByteReadSoFar = &(pecb->cbAvailable);
    
    fReturn =
    pecb->ServerSupportFunction(
            pecb->ConnID,
            HSE_REQ_IO_COMPLETION,
            AsyncReadClientIoCompletion,
            0,
            pByteReadSoFar);
 
    if (!fReturn) {
        hseStatus = HSE_STATUS_ERROR;
    }
 
    dwFlags = HSE_IO_ASYNC;
    fReturn = 
    pecb->ServerSupportFunction(
            pecb->ConnID,
            HSE_REQ_ASYNC_READ_CLIENT,
            g_ReadBuffer,
            &cbTotalToRead,
            &dwFlags);
 
    if (!fReturn) {
        hseStatus = HSE_STATUS_ERROR;
    }
 
    return (hseStatus);
}
 

For a complete working sample that performs an asynchronous read from a client, see Developer Samples.