Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
С помощью WinInet можно добавить поддержку FTP для скачивания и отправки файлов из приложения. Вы можете переопределить OnStatusCallback и использовать параметр dwContext для предоставления сведений о ходе выполнения пользователям при поиске и скачивании файлов.
В этой статье содержатся следующие разделы:
В приведенном ниже фрагменте кода показано, как создать простой браузер, скачать веб-страницу, FTP-файл и найти gopher-файл. Они не предназначены как полные примеры и не все содержат обработку исключений.
Дополнительные сведения о WinInet см. в разделе "Расширения Интернета Win32" (WinInet).
Создание очень простого браузера
#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();
}
Скачивание веб-страницы
//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
#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();
}
Получение каталога 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();
}
Использование функции OnStatusCallback
При использовании классов WinInet можно использовать элемент OnStatusCallback объекта CInternetSession приложения для получения сведений о состоянии. Если вы наследуете собственный CInternetSession объект, переопределите OnStatusCallbackи включите обратные вызовы состояния, MFC вызовет функцию OnStatusCallback со сведениями о ходе выполнения всех действий в этом сеансе Интернета.
Так как один сеанс может поддерживать несколько подключений (которые в течение их существования могут выполнять различные операции), OnStatusCallback требуется механизм для идентификации каждого изменения состояния с определенным подключением или транзакцией. Этот механизм предоставляется параметром идентификатора контекста, предоставленным многим функциям-членам в классах поддержки WinInet. Этот параметр всегда имеет тип DWORD и всегда называется dwContext.
Контекст, назначенный конкретному объекту Интернета, используется только для идентификации действия, вызываемого объектом в OnStatusCallback члене CInternetSession объекта. Вызов OnStatusCallback получает несколько параметров; эти параметры работают вместе, чтобы сообщить вашему приложению о достигнутом прогрессе за какие транзакции и соединения.
При создании CInternetSession объекта можно указать параметр dwContext конструктору.
CInternetSession само по себе не использует идентификатор контекста; Вместо этого он передает идентификатор контекста для любых объектов, производных от InternetConnection, которые явно не получают идентификатор контекста. В свою очередь, эти CInternetConnection объекты будут передавать идентификатор контекста объектам CInternetFile, которые они создают, если явно не указать другой идентификатор контекста. Если, наоборот, вы укажете конкретный идентификатор контекста, объект и любая работа, которую он выполняет, будут связаны с этим идентификатором контекста. Вы можете использовать идентификаторы контекста, чтобы определить, какая информация о состоянии предоставляется вам в функции OnStatusCallback.
Отображение сведений о ходе передачи файлов
Например, если вы создаете приложение, которое создает соединение с FTP-сервером для чтения файла, а также подключается к HTTP-серверу для получения веб-страницы, у вас будет CInternetSession объект, два CInternetConnection объекта (один CFtpSession будет одним из них, а другой — CHttpSessionи двумя CInternetFile объектами (по одному для каждого подключения). Если вы использовали значения по умолчанию для параметров dwContext , вы не сможете различать OnStatusCallback вызовы, указывающие ход выполнения подключения FTP и вызовы, указывающие ход выполнения подключения HTTP. Если вы укажете идентификатор dwContext, который можно позже проверить в OnStatusCallback, вы узнаете, какая операция сгенерировала обратный вызов.
См. также
Основы интернет-программирования MFC
Расширения Интернета Win32 (WinInet)