Udostępnij za pośrednictwem


Podstawy WinInet

Możesz użyć usługi WinInet, aby dodać obsługę protokołu FTP do pobierania i przekazywania plików z aplikacji. Możesz zastąpić parametr OnStatusCallback i użyć parametru dwContext , aby udostępnić użytkownikom informacje o postępie podczas wyszukiwania i pobierania plików.

Ten artykuł zawiera następujące tematy:

Poniższe fragmenty kodu pokazują, jak utworzyć prostą przeglądarkę, pobrać stronę internetową, ftp plik i wyszukać plik gopher. Nie są one przeznaczone jako kompletne przykłady, a nie wszystkie zawierają obsługę wyjątków.

Aby uzyskać dodatkowe informacje na temat systemu WinInet, zobacz Win32 Internet Extensions (WinInet).

Tworzenie bardzo prostej przeglądarki

#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();
}

Pobieranie strony sieci Web

//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 pliku

#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();
}

Pobieranie katalogu 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();
}

Korzystanie z elementu OnStatusCallback

W przypadku używania klas WinInet można użyć elementu członkowskiego OnStatusCallback obiektu CInternetSession aplikacji, aby pobrać informacje o stanie. Jeśli utworzysz własny CInternetSession obiekt, zastąpisz OnStatusCallbackmetodę i włączysz wywołanie zwrotne stanu, usługa MFC wywoła OnStatusCallback funkcję z informacjami o postępie wszystkich działań w tej sesji internetowej.

Ponieważ jedna sesja może obsługiwać kilka połączeń (które w okresie ich istnienia mogą wykonywać wiele różnych operacji), OnStatusCallback wymaga mechanizmu identyfikowania każdej zmiany stanu przy użyciu określonego połączenia lub transakcji. Ten mechanizm jest dostarczany przez parametr identyfikatora kontekstu podany dla wielu funkcji składowych w klasach obsługi WinInet. Ten parametr jest zawsze typu DWORD i zawsze nosi nazwę dwContext.

Kontekst przypisany do określonego obiektu internetowego jest używany tylko do identyfikowania działania, które obiekt powoduje w elemencie OnStatusCallback członkowskim CInternetSession obiektu. Wywołanie odbiera OnStatusCallback kilka parametrów. Te parametry współpracują ze sobą, aby poinformować aplikację o postępie transakcji i połączenia.

Podczas tworzenia CInternetSession obiektu można określić parametr dwContext konstruktorowi. CInternetSessionsam nie używa identyfikatora kontekstu; Zamiast tego przekazuje identyfikator kontekstu do dowolnych obiektów pochodnych internetu Połączenie ion, które nie otrzymują jawnie identyfikatora kontekstu własnego. Z kolei te CInternetConnection obiekty przekażą identyfikator kontekstu do CInternetFile obiektów, które tworzą, jeśli nie określisz jawnie innego identyfikatora kontekstu. Jeśli z drugiej strony określisz określony identyfikator kontekstu własnego, obiekt i wszystkie wykonywane prace zostaną skojarzone z tym identyfikatorem kontekstu. Możesz użyć identyfikatorów kontekstu, aby zidentyfikować, jakie informacje o stanie są przekazywane w OnStatusCallback funkcji.

Wyświetlanie informacji o postępie podczas przesyłania plików

Jeśli na przykład napiszesz aplikację, która tworzy połączenie z serwerem FTP w celu odczytania pliku, a także łączy się z serwerem HTTP w celu uzyskania strony sieci Web, będziesz mieć CInternetSession obiekt, dwa CInternetConnection obiekty (jeden będzie a CFtpSession drugi to CHttpSession), i dwa CInternetFile obiekty (po jednym dla każdego połączenia). Jeśli użyto wartości domyślnych dla parametrów dwContext , nie będzie można odróżnić OnStatusCallback wywołań wskazujących postęp połączenia FTP i wywołań wskazujących postęp połączenia HTTP. Jeśli określisz identyfikator dwContext , który można później przetestować w programie OnStatusCallback, będzie wiadomo, która operacja wygenerowała wywołanie zwrotne.

Zobacz też

MFC — podstawy programowania Internetu
Rozszerzenia internetowe Win32 (WinInet)