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 핸들을 만들고 사용하는 것을 보여 줍니다. 사용 가능한 다양한 유형의 핸들을 추적하기 위해 이러한 핸들의 이름은 일관됩니다. 다음 표에서는 설명서의 규칙에서 사용하는 식별자를 보여 있습니다.

핸들 형식 함수 만들기 핸들 ID
제네릭 핸들 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를 호출하거나 WinHttpQueryDataAvailableWinHttpReadData를 사용하여 리소스를 검색할 수 있습니다.

핸들 계층 구조의 웹 소켓

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