Compartir a través de


Conceptos básicos 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 busca y descarga 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, FTP un archivo y buscar un archivo gopher. No están diseñados como ejemplos completos y no todos contienen control de excepciones.

Para obtener más información sobre WinInet, consulta Win32 Internet Extensions (WinInet).

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

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

FTP a File

#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 de 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 CInternetSession objeto, invalida OnStatusCallbacky habilita las devoluciones de llamada de estado, MFC llamará a la OnStatusCallback función con información de progreso sobre toda la actividad de esa sesión de Internet.

Dado que una sola sesión puede admitir varias conexiones (que, durante su duración, pueden realizar muchas operaciones distintas diferentes), OnStatusCallback necesita un mecanismo para identificar cada cambio de estado con una conexión o transacción determinada. Ese mecanismo lo proporciona el parámetro de identificador de contexto proporcionado a muchas de las funciones miembro de las clases de soporte 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 OnStatusCallback miembro del CInternetSession objeto. La llamada a OnStatusCallback recibe varios parámetros; estos parámetros funcionan conjuntamente para indicar a la aplicación qué progreso se ha realizado para qué transacción y conexión.

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

Mostrar 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 CInternetSession objeto, dos CInternetConnection objetos (uno CFtpSession sería y el otro sería ) CHttpSessiony dos CInternetFile objetos (uno para cada conexión). Si usó valores predeterminados para los parámetros dwContext , no podrá distinguir entre las OnStatusCallback invocaciones que indican el progreso de la conexión FTP y las invocaciones que indican el progreso de la conexión HTTP. Si especifica un identificador dwContext , que puede probar más adelante en , OnStatusCallbacksabrá qué operación generó la devolución de llamada.

Consulte también

Conceptos básicos de programación de Internet de MFC
Extensiones de Internet win32 (WinInet)