다음을 통해 공유


WinHTTP의 HINTERNET 핸들

WinHTTP(Microsoft Windows HTTP 서비스)는 핸들을 사용하여 HTTP 프로토콜을 사용할 때 필요한 설정 및 정보를 추적합니다. 각 핸들은 HTTP 세션, HTTP 서버와의 연결 또는 특정 리소스와 관련된 정보를 유지 관리합니다. 이 항목에서는 다양한 유형의 핸들, 이러한 핸들에 대한 명명 규칙 및 해당 계층 구조에 대해 설명합니다.

HINTERNET 핸들 정보

WinHTTP에서 만들고 사용하는 핸들은 HINTERNET 핸들을 호출됩니다. WinHTTP 함수는 다른 핸들과 교환할 수 없는 HINTERNET 핸들을 반환하므로 ReadFile 또는 CloseHandle같은 함수와 함께 사용할 수 없습니다. 마찬가지로 WinHTTP 함수와 함께 다른 핸들을 사용할 수 없습니다. 예를 들어 CreateFile 반환된 핸들은 WinHttpReadData전달할 수 없습니다. 핸들을 사용하는 API 호출이 진행 중인 동안에는 이러한 HINTERNET 핸들을 닫을 수 없습니다. 경합 상태를 방지하기 위해 애플리케이션은 핸들을 보호하고 API 호출이 진행되는 동안 핸들이 닫히는 것을 방지해야 합니다.

Microsoft Win32 Internet(WinInet) 함수는 HINTERNET 핸들도 사용합니다. 그러나 WinInet 함수에 사용되는 핸들은 WinHTTP 함수에 사용되는 핸들과 교환할 수 없습니다. WinInet에 대한 자세한 내용은 WinINet 대한참조하세요.

WinHttpCloseHandle 함수는 WinHTTP HINTERNET 핸들을 닫습니다.

명명 핸들

WinHTTP 설명서 전체에서 API(애플리케이션 프로그래밍 인터페이스) 및 샘플 코드의 함수에 대한 설명은 다양한 유형의 HINTERNET 핸들을 만들고 사용하는 것을 보여 줍니다. 사용 가능한 다양한 유형의 핸들을 추적하기 위해 이러한 핸들의 이름은 일관됩니다. 다음 표에서는 설명서의 규칙에 사용되는 식별자를 보여줍니다.

핸들 형식 함수 만들기 핸들 식별자
제네릭 핸들 WinHttpOpen, winHttpConnect또는 WinHttpOpenRequest hInternet
세션 핸들 winHttpOpen hSession
연결 핸들 WinHttpConnect hConnect
요청 핸들 WinHttpOpenRequest hRequest
웹 소켓 핸들 WinHttpWebSocketCompleteUpgrade hWebSocket

계층 처리

HINTERNET 핸들은 계층 구조에서 유지 관리됩니다. WinHttpOpen 반환된 핸들은 HINTERNET 핸들을 세션입니다. winHttpOpen 호출하면 WinHTTP 함수가 초기화되고 세션 핸들의 수명 동안 사용자 정보 및 설정을 유지하는 세션 컨텍스트가 시작됩니다. WinHttpConnect 대상 HTTP 또는 HTTPS 서버를 지정하고 HINTERNET 핸들을 연결을 만듭니다. 기본적으로 연결 핸들은 세션 핸들에 대한 설정을 상속합니다. winHttpOpenRequest호출로 지정된 각 리소스에는 HINTERNET 핸들에 요청이 할당됩니다.

다음 다이어그램에서는 HINTERNET 핸들의 계층 구조를 보여 줍니다. 다이어그램의 각 상자는 HINTERNET 핸들을 반환하는 WinHTTP 함수를 나타냅니다.

핸들함수

핸들을 닫은 후에는 핸들이 완전히 닫혀 있음을 나타내기 위해 최종 WINHTTP_CALLBACK_STATUS_HANDLE_CLOSED 값이 반환될 때까지(또는 애플리케이션이 보류 중인 비동기 작업에서 콜백을 추적하고 대기하고 해당 핸들을 사용하여 추가 작업이 시도되지 않도록 하는 것과 같이 자체적으로 동일한 동기화를 수행할 때까지) 핸들에서 콜백 알림을 받을 수 있도록 애플리케이션을 준비해야 합니다.

세션 핸들은 만드는 데 사용되는 모든 연결 핸들의 부모라고 합니다. 마찬가지로 연결 핸들과 해당 부모 세션 핸들은 모두 연결 핸들을 만드는 데 사용되는 모든 요청 핸들의 부모라고 합니다.

부모 핸들이 닫히면 자식 핸들이 직접 닫혀 있지 않더라도 간접적으로 무효화되고 이를 사용하는 후속 요청은 오류 ERROR_INVALID_HANDLE함께 실패합니다. 보류 중인 비동기 요청은 올바르게 완료될 수 없습니다.

다음 다이어그램에서는 WinHttpOpenRequest만든 HINTERNET 핸들을 사용하는 함수를 보여 줍니다. 음영 처리된 상자는 핸들을 만드는 WinHTTP 함수를 나타내고, 일반 상자에는 이러한 HINTERNET 핸들을 사용하는 함수가 표시됩니다. 또한 다이어그램은 WinHTTP 함수가 일반적으로 호출되는 순서를 표시하도록 구성됩니다.

핸들함수

핸들 계층 구조에 대한 설명

먼저 WinHttpOpen사용하여 세션 핸들을 만듭니다. WinHttpConnect 첫 번째 매개 변수로 세션 핸들이 필요하고 지정된 서버에 대한 연결 핸들을 반환합니다. 요청 핸들은 WinHttpConnect의해 만들어진 연결 핸들을 사용하는 WinHttpOpenRequest의해 생성됩니다. 애플리케이션이 요청에 추가 헤더를 추가하도록 선택하거나 애플리케이션이 인증을 위해 자격 증명을 설정해야 하는 경우 이 요청 핸들을 사용하여 winHttpAddRequestHeadersWinHttpSetCredentials 호출할 수. 요청은 요청 핸들을 사용하는 WinHttpSendRequest의해 전송됩니다. 요청을 보낸 후 WinHttpWriteData사용하여 서버에 추가 데이터를 보내거나, 애플리케이션이 winHttpReceiveResponse직접 건너뛰어 서버에 더 이상 정보가 전송되지 않음을 지정할 수 있습니다. 이 시점에서 애플리케이션의 목적에 따라 요청 핸들을 사용하여 winHttpQueryHeaders, winHttpQueryAuthSchemes호출하거나 WinHttpQueryDataAvailable사용하여 리소스를 검색하고 WinHttpReadData수 있습니다.

핸들 계층 구조의 웹 소켓

웹 소켓 핸들은 연결 및 세션 핸들에서 상속되며 요청 핸들과 마찬가지로 핸들 계층 구조에서 비슷한 위치를 차지합니다. 웹 소켓 핸들을 만들려면 요청 핸들이 있어야 합니다. 그러나 웹 소켓 핸들이 만들어지면 요청이 닫히고 웹 소켓 핸들이 계속 작동합니다.