Sdílet prostřednictvím


WinInet – základy

WinInet můžete použít k přidání podpory FTP pro stahování a nahrávání souborů z vaší aplikace. Při hledání a stahování souborů můžete přepsat OnStatusCallback a pomocí parametru dwContext poskytnout uživatelům informace o průběhu.

Tento článek obsahuje následující témata:

Následující výňatek kódu ukazuje, jak vytvořit jednoduchý prohlížeč, stáhnout webovou stránku, soubor FTP a vyhledat soubor gopher. Nejsou určené jako úplné příklady a neobsahují všechny zpracování výjimek.

Další informace o síti WinInet naleznete v tématu Win32 Internet Extensions (WinInet).

Vytvoření velmi jednoduchého prohlížeče

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

Stažení webové stránky

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

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

Načtení adresáře 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();
}

Použití OnStatusCallback

Při použití WinInet třídy můžete použít OnStatusCallback člen cInternetSession vaší aplikace k načtení informací o stavu. Pokud odvozujete vlastní CInternetSession objekt, přepíšete OnStatusCallbacka povolíte zpětná volání stavu, mfc zavolá vaši OnStatusCallback funkci s informacemi o průběhu o všech aktivitách v této internetové relaci.

Vzhledem k tomu, že jedna relace může podporovat několik připojení (která v průběhu jejich životnosti můžou provádět mnoho různých různých operací), OnStatusCallback potřebuje mechanismus pro identifikaci každé změny stavu u konkrétního připojení nebo transakce. Tento mechanismus poskytuje parametr ID kontextu zadaný mnoha členským funkcím v třídách podpory WinInet. Tento parametr je vždy typu DWORD a vždy má název dwContext.

Kontext přiřazený konkrétnímu internetovému objektu slouží pouze k identifikaci aktivity, která objekt způsobuje ve OnStatusCallback členu objektu CInternetSession . Volání, které OnStatusCallback přijímá několik parametrů; tyto parametry spolupracují a říkají aplikaci, jaký pokrok se provedl pro kterou transakci a připojení.

Při vytváření objektu CInternetSession můžete zadat parametr dwContext konstruktoru. CInternetSessionsám nepoužívá ID kontextu; místo toho předá ID kontextu do libovolného internetu Připojení odvozené objekty, které explicitně nezískají vlastní ID kontextu. Tyto objekty pak předají ID CInternetFile kontextu objektům, které vytvoří, CInternetConnection pokud explicitně nezadáte jiné ID kontextu. Pokud na druhou stranu zadáte konkrétní ID vlastního kontextu, objekt a veškerou práci, kterou provede, bude přidružen k danému ID kontextu. Pomocí ID kontextu můžete zjistit, jaké informace o stavu se vám ve vaší OnStatusCallback funkci předají.

Zobrazení informací o průběhu při přenosu souborů

Pokud například napíšete aplikaci, která vytvoří připojení k serveru FTP pro čtení souboru a také se připojí k serveru HTTP, abyste získali webovou stránku, budete mít CInternetSession objekt, dva CInternetConnection objekty (jeden by byl CFtpSession a druhý by byl ) CHttpSessiona dva CInternetFile objekty (jeden pro každé připojení). Pokud jste pro parametry dwContext použili výchozí hodnoty, nebudete moct rozlišovat mezi OnStatusCallback vyvoláním, které označují průběh připojení FTP, a vyvoláním, které označují průběh připojení HTTP. Pokud zadáte ID dwContext , které můžete později otestovat v OnStatusCallback, budete vědět, která operace vygenerovala zpětné volání.

Viz také

Základy internetového programování v prostředí MFC
Win32 – internetová rozšíření (WinInet)