다음을 통해 공유


WinInet 기본 사항

WinInet를 사용하여 FTP 지원을 추가하여 애플리케이션 내에서 파일을 다운로드하고 업로드할 수 있습니다. OnStatusCallback을 재정하고 dwContext 매개 변수를 사용하여 파일을 검색하고 다운로드할 때 사용자에게 진행률 정보를 제공할 수 있습니다.

이 문서의 토픽은 다음과 같습니다.

아래 코드에서는 간단한 브라우저를 만들고, 웹 페이지를 다운로드하고, 파일을 FTP하고, gopher 파일을 검색하는 방법을 보여 줍니다. 완전한 예제가 아니며 모두 예외 처리를 포함하는 것은 아닙니다.

WinInet에 대한 자세한 내용은 Win32 인터넷 확장(WinInet)을 참조하세요.

매우 간단한 브라우저 만들기

#include <afxinet.h>

void DisplayPage(LPCTSTR pszURL)
{
   CInternetSession session(_T("My Session"));
   CStdioFile *pFile = NULL;
   CHAR szBuff[1024];
   //use a URL and print a Web page to the console
   pFile = session.OpenURL(pszURL);
   while (pFile->Read(szBuff, 1024) > 0)
   {
      printf_s("%1023s", szBuff);
   }
   delete pFile;
   session.Close();
}

웹 페이지 다운로드

//this code excerpt also demonstrates try/catch exception handling
#include <afxinet.h>

void DisplayHttpPage(LPCTSTR pszServerName, LPCTSTR pszFileName)
{
   CInternetSession session(_T("My Session"));
   CHttpConnection *pServer = NULL;
   CHttpFile *pFile = NULL;
   try
   {
      CString strServerName;
      INTERNET_PORT nPort = 80;
      DWORD dwRet = 0;

      pServer = session.GetHttpConnection(pszServerName, nPort);
      pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, pszFileName);
      pFile->SendRequest();
      pFile->QueryInfoStatusCode(dwRet);

      if (dwRet == HTTP_STATUS_OK)
      {
         CHAR szBuff[1024];
         while (pFile->Read(szBuff, 1024) > 0)
         {
            printf_s("%1023s", szBuff);
         }
      }
      delete pFile;
      delete pServer;
   }
   catch (CInternetException *pEx)
   {
      //catch errors from WinInet
      TCHAR pszError[64];
      pEx->GetErrorMessage(pszError, 64);
      _tprintf_s(_T("%63s"), pszError);
   }
   session.Close();
}

파일 FTP

#include <afxinet.h>

void GetFtpFile(LPCTSTR pszServerName, LPCTSTR pszRemoteFile, LPCTSTR pszLocalFile)
{
   CInternetSession session(_T("My FTP Session"));
   CFtpConnection *pConn = NULL;

   pConn = session.GetFtpConnection(pszServerName);
   //get the file
   if (!pConn->GetFile(pszRemoteFile, pszLocalFile))
   {
      //display an error
   }
   delete pConn;
   session.Close();
}

Gopher 디렉터리 검색

#include <afxinet.h>

void RetrieveGopherFile(LPCTSTR pszGopherSite, LPCTSTR pszFile)
{
   CInternetSession session(_T("My Gopher Session"));
   CGopherConnection *pConn = NULL;
   CGopherFileFind *pFile;

   pConn = session.GetGopherConnection(pszGopherSite);
   pFile = new CGopherFileFind(pConn);
   BOOL bFound = pFile->FindFile(pszFile);
   while (bFound)
   {
      //retrieve attributes of found file
      bFound = pFile->FindNextFile();
   }
   delete pFile;
   delete pConn;
   session.Close();
}

OnStatusCallback 사용

WinInet 클래스를 사용하는 경우 애플리케이션의 CInternetSession 개체의 OnStatusCallback 멤버를 사용하여 상태 정보를 검색할 수 있습니다. 고유한 CInternetSession 개체를 파생하고, 재정OnStatusCallback의하고, 상태 콜백을 사용하도록 설정하는 경우 MFC는 해당 인터넷 세션의 모든 활동에 대한 진행률 정보를 사용하여 함수를 호출 OnStatusCallback 합니다.

단일 세션은 여러 연결을 지원할 수 있으므로(수명 동안 다양한 고유 작업을 수행할 수 있음) OnStatusCallback 특정 연결 또는 트랜잭션을 사용하여 각 상태 변경을 식별하는 메커니즘이 필요합니다. 이 메커니즘은 WinInet 지원 클래스의 많은 멤버 함수에 지정된 컨텍스트 ID 매개 변수에 의해 제공됩니다. 이 매개 변수는 항상 DWORD 형식이며 항상 dwContext라고 합니다.

특정 인터넷 개체에 할당된 컨텍스트는 개체가 개체의 CInternetSession 멤버에서 OnStatusCallback 발생시키는 활동을 식별하는 데만 사용됩니다. 여러 매개 변수를 수신하는 OnStatusCallback 호출입니다. 이러한 매개 변수는 함께 작동하여 애플리케이션에 어떤 트랜잭션 및 연결이 진행되었는지 알려줍니다.

개체를 CInternetSession 만들 때 생성자에 dwContext 매개 변수를 지정할 수 있습니다. CInternetSession자체에서는 컨텍스트 ID를 사용하지 않습니다. 대신 컨텍스트 ID를 명시적으로 자체 컨텍스트 ID를 가져오지 않는 인터넷커넥트온 파생 개체에 전달합니다. 따라서 다른 컨텍스트 ID CInternetFile 를 명시적으로 지정하지 않으면 해당 CInternetConnection 개체가 만든 개체에 컨텍스트 ID를 전달합니다. 반면에 고유한 특정 컨텍스트 ID를 지정하는 경우 개체 및 개체가 수행하는 모든 작업은 해당 컨텍스트 ID와 연결됩니다. 컨텍스트 ID를 사용하여 함수에서 사용자에게 제공되는 상태 정보를 식별할 수 있습니다OnStatusCallback.

파일을 전송하는 동안 진행률 정보 표시

예를 들어 FTP 서버와의 연결을 만들어 파일을 읽고 웹 페이지를 가져오기 위해 HTTP 서버에 연결하는 애플리케이션을 작성하는 경우 개체, CInternetSessionCInternetConnection 개의 개체(하나는 a CFtpSession 이고 다른 CHttpSession개체는 1개) 및 두 개의 CInternetFile 개체(각 연결에 대해 하나씩)가 있습니다. dwContext 매개 변수에 기본값을 사용한 경우 FTP 연결의 진행률을 나타내는 호출과 HTTP 연결의 진행률을 나타내는 호출을 구분 OnStatusCallback 할 수 없습니다. 나중에 테스트할 수 있는 dwContext ID를 OnStatusCallback지정하면 콜백을 생성한 작업을 알 수 있습니다.

참고 항목

MFC 인터넷 프로그래밍 기본 사항
Win32 인터넷 확장(WinInet)