Fundamentos de WinInet

Puede usar WinInet para agregar compatibilidad con FTP para descargar y cargar archivos desde la aplicación. Puede invalidar OnStatusCallback y usar el parámetro dwContext para proporcionar información de progreso a los usuarios a medida que busque y descargue archivos.

Ese artículo contiene los siguientes temas:

Los extractos de código siguientes muestran cómo crear un explorador sencillo, descargar una página web, usar FTP con un archivo y buscar un archivo Gopher. No están diseñados como ejemplos completos y no todos contienen control de excepciones.

Para información adicional sobre WinInet, consulte Extensiones de Internet Win32 (WinInet).

Creación de un explorador muy sencillo

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

Descarga de una página 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();
}

Uso de FTP con un archivo

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

Recuperación de un directorio 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();
}

Uso de OnStatusCallback

Al usar las clases WinInet, puede usar el miembro OnStatusCallback del objeto CInternetSession de la aplicación para recuperar la información de estado. Si deriva su propio objeto CInternetSession, invalida OnStatusCallback y habilita las devoluciones de llamada de estado, MFC llamará a la función OnStatusCallback con información de progreso sobre toda la actividad de esa sesión de Internet.

Dado que una sesión única puede admitir varias conexiones (que, a lo largo de su vigencia, pueden realizar muchas operaciones distintas), OnStatusCallback necesita un mecanismo para identificar cada cambio de estado con una transacción o conexión determinada. Ese mecanismo lo proporciona el parámetro de identificador de contexto entregado a muchas de las funciones miembro de las clases de compatibilidad de WinInet. Este parámetro siempre es de tipo DWORD y siempre se denomina dwContext.

El contexto asignado a un objeto de Internet determinado solo se usa para identificar la actividad que provoca el objeto en el miembro OnStatusCallback del objeto CInternetSession. La llamada a OnStatusCallback recibe varios parámetros; estos parámetros funcionan conjuntamente para indicar a la aplicación el progreso que se ha hecho y para qué transacción y conexión.

Al crear un objeto CInternetSession, puede especificar un parámetro dwContext al constructor. CInternetSession en sí no usa el identificador de contexto; en su lugar, pasa el identificador de contexto a cualquier objeto derivado de InternetConnection que no obtiene explícitamente un identificador de contexto propio. A su vez, esos objetos CInternetConnection pasarán el identificador de contexto a los objetos CInternetFile que crean si no se especifica explícitamente un identificador de contexto distinto. Por otro lado, si especifica un identificador de contexto específico propio, el objeto y cualquier trabajo que haga se asociarán a ese identificador de contexto. Puede usar los identificadores de contexto para identificar qué información de estado se le proporciona en la función OnStatusCallback.

Visualización de información de progreso al transferir archivos

Por ejemplo, si escribe una aplicación que crea una conexión con un servidor FTP para leer un archivo y también se conecta a un servidor HTTP para obtener una página web, tendrá un objeto CInternetSession, dos objetos CInternetConnection (uno sería CFtpSession y el otro, CHttpSession) y dos objetos CInternetFile (uno para cada conexión). Si usó valores predeterminados para los parámetros dwContext, no podrá distinguir entre las invocaciones OnStatusCallback que indican el progreso de la conexión FTP y las que indican el progreso de la conexión HTPP. Si especifica un identificador dwContext. que más adelante puede probar en OnStatusCallback, sabrá qué operación generó la devolución de llamada.

Consulte también

Fundamentos de programación para Internet de MFC
Extensiones de Internet Win32 (WinInet)