티스토리 뷰

windows

[windows] wininet 사용법과 예제

풀풀풀 아풀 2018. 7. 12. 17:57

wininet

wininet api를 이용하여 인터넷에서 파일을 다운로드 받을 수 있다.
간단하게 흐름을 보면 아래와 같다.

1. 인터넷 open

hinet = InternetOpen(_T("Test"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);

2. open된 인터넷 핸들에 connect → request 핸들 얻기 ( POST/GET 에 따른 ) → 얻은 핸들을 사용하여 request 보내기

hconnect = InternetConnect(hinet,
			_T("download.microsoft.com"),
			INTERNET_DEFAULT_HTTP_PORT, 
			_T(""), 
			_T(""),
			INTERNET_SERVICE_HTTP, 
			0, 
			0);

hreq = HttpOpenRequest(hconnect,
			_T("GET"),
			_T("/download/ .. 생략 "),
			NULL,
			NULL,
			NULL,
			0,
			0);
						
HttpSendRequest(hreq, NULL, 0, NULL, 0); 

위의 connect → open request → send request 의 세가지 과정을 open url 하나로 할 수 있다고 한다. (아래 참고)
hurl = InternetOpenUrl(hinet, _T("http://download.microsoft.com/download/ .. 생략 "), NULL, 0, 0, 0);

3. 파일의 전체 크기 등 정보를 얻기 ( query 통해서 )

HttpQueryInfo(hurl, HTTP_QUERY_CONTENT_LENGTH, buf, &dwSize, NULL);

4. 서버가 보낼 수 있는 양을 확인 후, 서버로 부터 데이터를 읽기

InternetQueryDataAvailable(p->hreq, &toRead,0,0);
InternetReadFile(p->hreq, pbuf, toRead, &dwReadSize);

4번 과정 이후로는 읽어온 데이터는 pbuf 에 들어있을테니까 
WriteFile을 통해서 읽어온 데이터를 쓰고싶은 위치에 쓰면 파일 다운로드가 완료될 것이다!
( createfile 통해 핸들 얻기 → writefile → close 핸들 )

InternetReadFile을 통해서 얼만큼 읽어왔는지 dwReadSize를 통해 확인하고
전체 파일 크기는 HttpQueryInfo를 통해 확인할 수 있다.

전체 파일 크기중 얼만큼 읽었는지 확인하면서 InternetReadFile 을 반복하여 실행하여 전체를 다 읽는다.

전체 파일을 다 읽었으면 InternetCloseHandle을 통해 request, connection, open 에 대하여 모든 핸들을 닫아준다.
( HttpOpenRequest, InternetConnect, InternetOpen 으로 열었던 핸들 )

파라미터에 대한 설명들과 사용법이 잘 정리된 곳이 있어 링크 남겨요 ;)


댓글
댓글쓰기 폼