*/

WinInet을 이용하여 http 서버에서 파일 다운로드 받기

Header
   wininet.h
API
   InternetOpen( )                     - WinInet 함수들을 초기화
   InternetConnect( )                 - Http혹은 FTP 사이트 연결
   HttpOpenRequest( )               - HTTP Request handle 생성
   HttpSendRequest( )                - HTTP 서버로 Request 전달
   HttpQueryInfo( )                    - 파일을 전체크기
   InternetQueryDataAvailable( )   - 서버가 바로보낼수 있는 크기를 알려줌
   InternetReadFile( )                  - 서버로부터 지정된 크기만큼 파일을 읽어옴
   InternetCloseHandle( )             - 열려있는 핸들을 닫음


예제

#include < wininet.h >
  HINTERNET hOpen, hConnect, hReq;
  LPCSTR postheader = "Content-Type: application/x-www-form-urlencoded";
  int port = 80;

  hOpen = InternetOpen("SimplePost", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
  if(hOpen == NULL)  {
     return -1;
  }
  // "127.0.0.1"대신에 다운받을 화일이 있는 서버주소를 입력 
  hConnect = InternetConnect(hOpen, "127.0.0.1", port, 0, 0, INTERNET_SERVICE_HTTP, 0, 0);
  hReq = HttpOpenRequest(hConnect, "POST", "/test.bin", "HTTP/1.1", 0, 0, INTERNET_FLAG_NO_CACHE_WRITE, 0);
  HttpSendRequest(hReq, postheader, lstrlen(postheader), NULL, 0);

  DWORD dwRead = 0;
  DWORD Size;
  CHAR Data[1025] = "";
  FileOpen("Filename");
  do 
  {     // 다운받는화일의 나머지 크기 얻어오기
     InternetQueryDataAvailable(hReq,&Size,0,0);     // 남은 크기가 1024보다 크면 1024로 고정
     if(Size>1024) Size = 1024;
     InternetReadFile(hReq, (LPVOID)Data, Size, &dwRead);
     if(dwRead) {
        Data[dwRead] = 0x00;
        FileWrite(Data, Size);
     }
  } while(dwRead != 0);  //읽어온 데이터의 크기가 0이 아니면 계속 반복

  FileClose();

  InternetCloseHandle(hConnect);
  InternetCloseHandle(hOpen);

  hConnect = NULL;
  hOpen = NULL;

// FileOpen(), FIleWrite(), FIleClose()함수 별도

0 comments:

댓글 쓰기