WinHttpWriteData 함수(winhttp.h)

WinHttpWriteData 함수는 요청 데이터를 HTTP 서버에 씁니다.

구문

WINHTTPAPI BOOL WinHttpWriteData(
  [in]  HINTERNET hRequest,
  [in]  LPCVOID   lpBuffer,
  [in]  DWORD     dwNumberOfBytesToWrite,
  [out] LPDWORD   lpdwNumberOfBytesWritten
);

매개 변수

[in] hRequest

WinHttpOpenRequest에서 반환된 유효한 HINTERNET 핸들입니다. 이 함수를 호출하기 전에 WinHttpSendRequest 가 완료될 때까지 기다립니다.

[in] lpBuffer

서버로 보낼 데이터가 포함된 버퍼에 대한 포인터입니다. WinHttpWriteData가 완료될 때까지 이 버퍼가 유효한지 확인합니다.

[in] dwNumberOfBytesToWrite

파일에 쓸 바이트 수를 포함하는 부호 없는 long 정수 값입니다.

[out] lpdwNumberOfBytesWritten

버퍼에 기록된 바이트 수를 수신하는 부호 없는 long 정수 변수에 대한 포인터입니다. WinHttpWriteData 함수는 작업 또는 오류 검사를 수행하기 전에 이 값을 0으로 설정합니다. WinHTTP를 비동기적으로 사용하는 경우 이 매개 변수를 NULL 로 설정하고 콜백 함수에서 정보를 검색해야 합니다. 이렇게 하지 않을 경우 메모리 오류가 발생할 수 있습니다.

반환 값

성공하면 TRUE를 반환하고 그렇지 않으면 FALSE를 반환합니다. 확장된 오류 정보는 GetLastError를 호출합니다. 반환된 오류 코드 중에는 다음이 있습니다.

오류 코드 Description
ERROR_WINHTTP_CONNECTION_ERROR
서버와의 연결이 다시 설정되거나 종료되었거나 호환되지 않는 SSL 프로토콜이 발견되었습니다. 예를 들어 WinHTTP 버전 5.1은 클라이언트가 특별히 사용하도록 설정하지 않는 한 SSL2를 지원하지 않습니다.
ERROR_WINHTTP_INCORRECT_HANDLE_STATE
제공된 핸들이 올바른 상태가 아니므로 요청된 작업을 수행할 수 없습니다.
ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
이 작업에 대해 제공된 핸들의 형식이 올바르지 않습니다.
ERROR_WINHTTP_INTERNAL_ERROR
내부 오류가 발생했습니다.
ERROR_WINHTTP_OPERATION_CANCELLED
작업이 완료되기 전에 요청이 작동 중인 핸들이 닫혔기 때문에 작업이 취소되었습니다.
ERROR_WINHTTP_TIMEOUT
요청 시간이 초과되었습니다.
ERROR_NOT_ENOUGH_MEMORY
메모리가 부족하여 요청된 작업을 완료할 수 없습니다. (Windows 오류 코드)

설명

WinHTTP가 비동기 모드에서 사용되는 경우에도(즉, WinHttpOpen에서 WINHTTP_FLAG_ASYNC 설정된 경우) 이 함수는 동기적으로 또는 비동기적으로 작동할 수 있습니다. 이 함수가 FALSE를 반환하는 경우 GetLastError 를 호출하여 확장된 오류 정보를 가져올 수 있습니다. 이 함수가 TRUE를 반환하는 경우 WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE 완료를 사용하여 이 함수가 성공했는지 여부와 매개 변수 값을 확인합니다. WINHTTP_CALLBACK_STATUS_REQUEST_ERROR 완료는 작업이 비동기적으로 완료되었지만 실패했음을 나타냅니다.

경고 WinHTTP를 비동기적으로 사용하는 경우 항상 lpdwNumberOfBytesWritten 매개 변수를 NULL 로 설정하고 콜백 함수에 기록된 바이트를 검색합니다. 그렇지 않으면 메모리 오류가 발생할 수 있습니다.
 
애플리케이션이 데이터를 보낼 때 WinHttpReceiveResponse 를 호출하여 데이터 전송을 종료할 수 있습니다. WinHttpCloseHandle이 호출되면 데이터 전송이 중단됩니다.

winHttpSetStatusCallback과 함께 상태 콜백 함수가 설치된 경우 WinHttpSetStatusCallbackdwNotificationFlags 매개 변수에 설정된 다음 알림 중에서 서버에 데이터를 보내는 진행 상황을 나타냅니다.

  • WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
  • WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
  • WINHTTP_CALLBACK_STATUS_DATA_WRITTEN
  • WINHTTP_CALLBACK_STATUS_SENDING_REQUEST
  • WINHTTP_CALLBACK_STATUS_REQUEST_SENT
  • WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE
NTLM 또는 협상 인증을 사용하는 데 문제가 있는 프록시 또는 서버에 데이터를 POST(또는 PUT)하려고 할 때 두 가지 문제가 발생할 수 있습니다. 먼저 이러한 프록시 또는 서버는 401/407 챌린지를 보내고 모든 데이터가 POST'ed가 되기 전에 연결을 닫을 수 있습니다. 이 경우 WinHttpWriteData 가 실패할 뿐만 아니라 WinHTTP가 인증 챌린지를 처리할 수 없습니다. NTLM 및 협상은 모든 인증 핸드셰이크를 동일한 소켓 연결에서 교환해야 하므로 연결이 조기에 끊어지면 인증이 실패합니다.

둘째, NTLM 및 협상은 인증을 완료하기 위해 여러 핸드셰이크가 필요할 수 있으며, 각 인증 다리에 대해 데이터를 다시 POST'로 설정해야 합니다. 이는 대용량 데이터 업로드에 매우 비효율적일 수 있습니다.

이러한 두 문제를 해결하기 위해 한 가지 해결 방법은 먼저 인증 v-dir에 HEAD 같은 멱등성 준비 요청을 보내고, 이 요청과 관련된 인증 챌린지를 처리한 다음 POST 데이터만 처리하는 것입니다. POST'ing을 처리하는 데 동일한 소켓을 다시 사용하는 한 추가 인증 문제가 발생하지 않아야 하며 모든 데이터를 한 번에 업로드할 수 있습니다. 인증된 소켓은 동일한 세션 내의 후속 요청에만 재사용할 수 있으므로 소켓이 동시에 경쟁하는 요청으로 풀링되지 않는 한 POST는 동일한 소켓에서 나가야 합니다.

참고 Windows XP 및 Windows 2000의 경우 WinHTTP 시작 페이지의 런타임 요구 사항 섹션을 참조하세요.
 

예제

이 예제에서는 HTTP 서버에 데이터를 쓰는 코드를 보여 줍니다. 예제에 제공된 서버 이름 (www.wingtiptoys.com)은 가상이며 쓰기 액세스 권한이 있는 서버의 이름으로 바꿔야 합니다.

    PCSTR pszData = "WinHttpWriteData Example";
    DWORD dwBytesWritten = 0;
    BOOL  bResults = FALSE;
    HINTERNET hSession = NULL,
              hConnect = NULL,
              hRequest = NULL;

    // Use WinHttpOpen to obtain a session handle.
    hSession = WinHttpOpen(  L"A WinHTTP Example Program/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.wingtiptoys.com",
                                   INTERNET_DEFAULT_HTTP_PORT, 0);

    // Create an HTTP Request handle.
    if (hConnect)
        hRequest = WinHttpOpenRequest( hConnect, L"PUT", 
                                       L"/writetst.txt", 
                                       NULL, WINHTTP_NO_REFERER, 
                                       WINHTTP_DEFAULT_ACCEPT_TYPES, 
                                       0);

    // Send a Request.
    if (hRequest) 
        bResults = WinHttpSendRequest( hRequest, 
                                       WINHTTP_NO_ADDITIONAL_HEADERS,
                                       0, WINHTTP_NO_REQUEST_DATA, 0, 
                                       (DWORD)strlen(pszData), 0);

    // Write data to the server.
    if (bResults)
        bResults = WinHttpWriteData( hRequest, pszData, 
                                     (DWORD)strlen(pszData), 
                                     &dwBytesWritten);

    // End the request.
    if (bResults)
        bResults = WinHttpReceiveResponse( hRequest, NULL);

    // Report any errors.
    if (!bResults)
        printf("Error %d has occurred.\n",GetLastError());


    // Close any 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 이상.

추가 정보

Microsoft Windows HTTP 서비스 정보(WinHTTP)

WinHTTP 버전

WinHttpConnect

WinHttpOpen

WinHttpOpenRequest