WinHttpQueryDataAvailable 함수(winhttp.h)
WinHttpQueryDataAvailable 함수는 WinHttpReadData로 읽을 수 있는 데이터의 양을 바이트 단위로 반환합니다.
구문
WINHTTPAPI BOOL WinHttpQueryDataAvailable(
[in] HINTERNET hRequest,
[out] LPDWORD lpdwNumberOfBytesAvailable
);
매개 변수
[in] hRequest
WinHttpOpenRequest에서 반환된 유효한 HINTERNET 핸들입니다. WinHttpReceiveResponse 는 이 핸들에 대해 호출되었고 WinHttpQueryDataAvailable 이 호출되기 전에 완료되어야 합니다.
[out] lpdwNumberOfBytesAvailable
사용 가능한 바이트 수를 수신하는 부호 없는 긴 정수 변수에 대한 포인터입니다. WinHTTP가 비동기 모드에서 사용되는 경우 항상 이 매개 변수를 NULL 로 설정하고 콜백 함수에서 데이터를 검색합니다. 이렇게 하지 않을 경우 메모리 오류가 발생할 수 있습니다.
반환 값
함수가 성공하면 TRUE 를 반환하고, 그렇지 않으면 FALSE 를 반환합니다. 확장 오류 데이터를 얻으려면 GetLastError를 호출합니다. 반환된 오류 코드 중에는 다음과 같습니다.
오류 코드 | Description |
---|---|
|
서버와의 연결이 다시 설정되거나 종료되었거나 호환되지 않는 SSL 프로토콜이 발견되었습니다. 예를 들어 WinHTTP 버전 5.1은 클라이언트가 특별히 사용하도록 설정하지 않는 한 SSL2를 지원하지 않습니다. |
|
제공된 핸들이 올바른 상태가 아니므로 요청된 작업을 완료할 수 없습니다. |
|
제공된 핸들의 형식이 이 작업에 잘못되었습니다. |
|
내부 오류가 발생했습니다. |
|
작업이 완료되기 전에 요청이 작동 중인 핸들이 닫혔기 때문에 작업이 취소되었습니다. |
|
요청 시간이 초과되었습니다. |
|
요청된 작업을 완료하는 데 사용할 수 있는 메모리가 부족합니다. (Windows 오류 코드) |
설명
WinHTTP가 비동기 모드에서 사용되는 경우에도(즉, WinHttpOpen에서 WINHTTP_FLAG_ASYNC 설정된 경우) 이 함수는 동기적으로 또는 비동기적으로 작동할 수 있습니다. FALSE를 반환하는 경우 실패했으며 GetLastError를 호출하여 확장된 오류 정보를 가져올 수 있습니다. TRUE를 반환하는 경우 WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE 완료를 사용하여 이 함수가 성공했는지 여부와 매개 변수 값을 확인합니다. WINHTTP_CALLBACK_STATUS_REQUEST_ERROR 완료는 작업이 비동기적으로 완료되었지만 실패했음을 나타냅니다.
WinHttpQueryDataAvailable 호출로 표시된 사용 가능한 모든 데이터를 읽을 때까지 남아 있는 데이터의 양은 다시 계산되지 않습니다.
WinHttpReadData의 반환 값을 사용하여 응답이 완전히 읽혀진 시기를 확인합니다.
WinHttpSetStatusCallback과 함께 상태 콜백 함수가 설치된 경우 WinHttpSetStatusCallback의 dwNotificationFlags 매개 변수에 설정된 다음 알림 중에서 사용 가능한 데이터를 확인하는 진행률을 나타냅니다.
- WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
- WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
- WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE
예제
다음 예제에서는 보안 트랜잭션 의미 체계를 사용하여 HTTPS 서버에서 리소스를 다운로드하는 방법을 보여 줍니다. 샘플 코드는 WinHTTP API를 초기화하고 대상 HTTPS 서버를 선택한 다음 이 보안 리소스에 대한 요청을 열고 보냅니다.
WinHttpQueryDataAvailable 은 요청 핸들과 함께 사용하여 다운로드할 수 있는 데이터의 양을 확인한 다음 WinHttpReadData 를 사용하여 해당 데이터를 읽습니다. 이 프로세스는 전체 문서를 검색하고 표시할 때까지 반복됩니다.
중요
가능한 한 빨리 일부 데이터를 원하는 경우(즉, 데이터를 수신할 때 데이터를 처리하고 구문 분석하는 경우) WinHttpQueryDataAvailable 및 WinHttpReadData를 호출해야 합니다. 전체 응답을 가능한 한 빨리 다운로드하려는 경우 WinHttpReadData 가 완료되기 전에 버퍼를 채우려고 하기 때문에 WinHttpReadData 를 직접 호출합니다.
또한 아래 코드 예제는 모든 루프 반복에 할당합니다. 성능이 중요한 프로덕션 코드의 경우 적절한 크기의 버퍼(아마도 1메가바이트)로 시작하고 필요한 경우 크기를 조정할 수 있습니다. 실제로 WinHttpQueryDataAvailable 은 8킬로바이트 이하를 반환합니다.
DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer;
BOOL bResults = FALSE;
HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;
// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen( L"WinHTTP Example/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
// Specify an HTTP server.
if (hSession)
hConnect = WinHttpConnect( hSession, L"www.microsoft.com",
INTERNET_DEFAULT_HTTPS_PORT, 0);
// Create an HTTP request handle.
if (hConnect)
hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL,
NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_SECURE);
// Send a request.
if (hRequest)
bResults = WinHttpSendRequest( hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS,
0, WINHTTP_NO_REQUEST_DATA, 0,
0, 0);
// End the request.
if (bResults)
bResults = WinHttpReceiveResponse( hRequest, NULL);
// Continue to verify data until there is nothing left.
if (bResults)
do
{
// Verify available data.
dwSize = 0;
if (!WinHttpQueryDataAvailable( hRequest, &dwSize))
printf( "Error %u in WinHttpQueryDataAvailable.\n",
GetLastError());
// Allocate space for the buffer.
pszOutBuffer = new char[dwSize+1];
if (!pszOutBuffer)
{
printf("Out of memory\n");
dwSize=0;
}
else
{
// Read the Data.
ZeroMemory(pszOutBuffer, dwSize+1);
if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer,
dwSize, &dwDownloaded))
printf( "Error %u in WinHttpReadData.\n", GetLastError());
else
printf( "%s\n", pszOutBuffer);
// Free the memory allocated to the buffer.
delete [] pszOutBuffer;
}
} while (dwSize > 0);
// Report any errors.
if (!bResults)
printf( "Error %d has occurred.\n", GetLastError());
// Close open handles.
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);
요구 사항
지원되는 최소 클라이언트 | Windows XP, Windows 2000 Professional SP3 포함 [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003, Windows 2000 Server SP3 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | winhttp.h |
라이브러리 | Winhttp.lib |
DLL | Winhttp.dll |
재배포 가능 파일 | Windows XP 및 Windows 2000에서 WinHTTP 5.0 및 인터넷 Explorer 5.01 이상. |