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)