Основные сведения о 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 можно использовать элемент OnStatusCallback объекта CInternetSession приложения для получения сведений о состоянии. Если вы наследуете собственный CInternetSession объект, переопределите OnStatusCallbackи включите обратные вызовы состояния, MFC вызовет функцию OnStatusCallback со сведениями о ходе выполнения всех действий в этом сеансе Интернета.

Так как один сеанс может поддерживать несколько подключений (которые в течение их существования могут выполнять различные операции), OnStatusCallback требуется механизм для идентификации каждого изменения состояния с определенным подключением или транзакцией. Этот механизм предоставляется параметром идентификатора контекста, предоставленным многим функциям-членам в классах поддержки WinInet. Этот параметр всегда имеет тип DWORD и всегда называется dwContext.

Контекст, назначенный конкретному объекту Интернета, используется только для идентификации действия, вызываемого объектом в OnStatusCallback члене CInternetSession объекта. Вызов OnStatusCallback получения нескольких параметров; эти параметры работают вместе, чтобы сообщить приложению о ходе выполнения, для которого была выполнена транзакция и подключение.

При создании CInternetSession объекта можно указать параметр dwContext конструктору. CInternetSessionсамо по себе не использует идентификатор контекста; Вместо этого он передает идентификатор контекста для любых объектов, производных от Интернета Подключение ion, которые явно не получают идентификатор контекста. В свою очередь, эти CInternetConnection объекты будут передавать идентификатор контекста вместе CInternetFile с объектами, которые они создают, если явно не указать другой идентификатор контекста. Если, с другой стороны, укажите определенный идентификатор контекста, объект и любая работа, которую она делает, будет связана с этим идентификатором контекста. Идентификаторы контекста можно использовать для определения сведений о состоянии, предоставленных вам в функции OnStatusCallback .

Отображение сведений о ходе передачи файлов

Например, если вы создаете приложение, которое создает соединение с FTP-сервером для чтения файла, а также подключается к HTTP-серверу для получения веб-страницы, у вас будет CInternetSession объект, два CInternetConnection объекта (один CFtpSession будет одним из них, а другой — CHttpSessionи двумя CInternetFile объектами (по одному для каждого подключения). Если вы использовали значения по умолчанию для параметров dwContext , вы не сможете различать OnStatusCallback вызовы, указывающие ход выполнения подключения FTP и вызовы, указывающие ход выполнения подключения HTTP. Если указать идентификатор dwContext , для которого можно позже протестировать OnStatusCallback, вы узнаете, какая операция вызвала обратный вызов.

См. также

Основы программирования для интернет-решений MFC
Расширения Интернета Win32 (WinInet)