Podstawy WinInet
Aby dodać obsługę FTP do pobierania i przekazywania plików od w aplikacji, można użyć usługi WinInet.Można zastąpić OnStatusCallback i dwContext parametr informacje o postępie dla użytkowników podczas wyszukiwania i pobierania plików.
W tym artykule omówiono następujące tematy:
Tworzenie bardzo prosty przeglądarki
Pobieranie strony sieci Web
FTP pliku
Pobieranie katalogu Gopher
Wyświetlanie informacji o postępie podczas transferu plików
Fragmenty kodu poniżej pokazano sposób tworzenia prostych przeglądarki, pobieranie strony sieci Web, FTP, plik i wyszukaj plik gopher.Nie są przeznaczone jako przykłady kompletny i nie wszystkie z nich zawierają obsługi wyjątków.
Aby uzyskać dodatkowe informacje, WinInet, zobacz Win32 Internet Extensions (WinInet).
Tworzenie bardzo prosty przeglądarki
#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();
}
Pobieranie strony sieci 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 pliku
#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();
}
Pobieranie katalogu 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();
}
Użyj OnStatusCallback
Korzystając z klasy WinInet, można użyć OnStatusCallback Członkowskich aplikacji CInternetSession obiekt, aby pobrać informacje o stanie.Jeśli własne CInternetSession obiektów, należy zastąpić OnStatusCallbacki włączyć stan wywołania zwrotne, MFC będzie wywoływać your OnStatusCallback funkcji postępu informacje o wszystkich działalności w tej sesji internetowej.
Ponieważ jedna sesja może obsługiwać kilka połączeń (które nad ich istnienia, może wykonywać wiele różnych operacji odrębne), OnStatusCallback potrzebuje mechanizm identyfikacji każdej zmiany stanu z określonego połączenia lub transakcji.Tego mechanizmu jest dostarczana przez parametr identyfikator kontekstu do wielu funkcji Członkowskich klas wsparcia WinInet.Ten parametr jest zawsze typu DWORD i zawsze o nazwie dwContext.
Kontekst, przypisane do określonego obiektu internetowego jest używany tylko do identyfikowania działanie obiektu powoduje, że w OnStatusCallback członek CInternetSession obiektu.Wywołanie OnStatusCallback odbiera kilka parametrów; Parametry te działają razem aplikacji stwierdzić, jaki poczyniono na którym transakcji i połączenia.
Podczas tworzenia CInternetSession obiektu, można określić dwContext parametr do konstruktora.CInternetSessionsam nie używa Identyfikatora kontekstu; Zamiast tego, przekazuje Identyfikatora kontekstu do dowolnego InternetConnection-pochodzących z obiektów, które wyraźnie nie otrzymasz identyfikator kontekstu własne.Z kolei, te CInternetConnection obiekty będą przekazywać Identyfikatora kontekstu wraz z CInternetFile obiektów tworzą, jeśli nie jest jawnie określić identyfikatora kontekstu różnychJeżeli, z drugiej strony, określ identyfikator szczególnym kontekście własnych, obiekt i wszelkich prac będzie skojarzony z tym identyfikatorem kontekstu.Można określić, jakie informacje o stanie są przyznawane użytkownikowi w kontekście identyfikatory sieci OnStatusCallback funkcji.
Wyświetlanie informacji o postępie podczas transferu plików
Na przykład, jeśli piszesz aplikacji, która tworzy połączenie z serwerem FTP do odczytu pliku, a także łączy się z serwerem HTTP, aby uzyskać stronę sieci Web, będziesz mieć CInternetSession obiektu, dwa CInternetConnection obiektów (jeden byłby CFtpSession i drugi byłoby CHttpSession) oraz dwóch CInternetFile obiekty (po jednym dla każdego połączenia).Jeśli użyto wartości domyślnych dla dwContext parametry, możesz nie mogliby rozróżnienie między OnStatusCallback wywołania, które wskazują postępu dla połączenia FTP i wywołania, które wskazują postępu dla połączeń HTTP.Jeśli określisz dwContext identyfikator, który później można sprawdzić w OnStatusCallback, będzie wiadomo, która operacja generowane wywołanie zwrotne.