Podstawy WinInet
Możesz użyć usługi WinInet, aby dodać obsługę protokołu FTP do pobierania i przekazywania plików z aplikacji. Możesz zastąpić parametr OnStatusCallback i użyć parametru dwContext , aby udostępnić użytkownikom informacje o postępie podczas wyszukiwania i pobierania plików.
Ten artykuł zawiera następujące tematy:
Poniższe fragmenty kodu pokazują, jak utworzyć prostą przeglądarkę, pobrać stronę internetową, ftp plik i wyszukać plik gopher. Nie są one przeznaczone jako kompletne przykłady, a nie wszystkie zawierają obsługę wyjątków.
Aby uzyskać dodatkowe informacje na temat systemu WinInet, zobacz Win32 Internet Extensions (WinInet).
Tworzenie bardzo prostej 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();
}
Korzystanie z elementu OnStatusCallback
W przypadku używania klas WinInet można użyć elementu członkowskiego OnStatusCallback obiektu CInternetSession aplikacji, aby pobrać informacje o stanie. Jeśli utworzysz własny CInternetSession
obiekt, zastąpisz OnStatusCallback
metodę i włączysz wywołanie zwrotne stanu, usługa MFC wywoła OnStatusCallback
funkcję z informacjami o postępie wszystkich działań w tej sesji internetowej.
Ponieważ jedna sesja może obsługiwać kilka połączeń (które w okresie ich istnienia mogą wykonywać wiele różnych operacji), OnStatusCallback
wymaga mechanizmu identyfikowania każdej zmiany stanu przy użyciu określonego połączenia lub transakcji. Ten mechanizm jest dostarczany przez parametr identyfikatora kontekstu podany dla wielu funkcji składowych w klasach obsługi WinInet. Ten parametr jest zawsze typu DWORD i zawsze nosi nazwę dwContext.
Kontekst przypisany do określonego obiektu internetowego jest używany tylko do identyfikowania działania, które obiekt powoduje w elemencie OnStatusCallback
członkowskim CInternetSession
obiektu. Wywołanie odbiera OnStatusCallback
kilka parametrów. Te parametry współpracują ze sobą, aby poinformować aplikację o postępie transakcji i połączenia.
Podczas tworzenia CInternetSession
obiektu można określić parametr dwContext konstruktorowi. CInternetSession
sam nie używa identyfikatora kontekstu; Zamiast tego przekazuje identyfikator kontekstu do dowolnych obiektów pochodnych internetu Połączenie ion, które nie otrzymują jawnie identyfikatora kontekstu własnego. Z kolei te CInternetConnection
obiekty przekażą identyfikator kontekstu do CInternetFile
obiektów, które tworzą, jeśli nie określisz jawnie innego identyfikatora kontekstu. Jeśli z drugiej strony określisz określony identyfikator kontekstu własnego, obiekt i wszystkie wykonywane prace zostaną skojarzone z tym identyfikatorem kontekstu. Możesz użyć identyfikatorów kontekstu, aby zidentyfikować, jakie informacje o stanie są przekazywane w OnStatusCallback
funkcji.
Wyświetlanie informacji o postępie podczas przesyłania plików
Jeśli na przykład napiszesz aplikację, która tworzy połączenie z serwerem FTP w celu odczytania pliku, a także łączy się z serwerem HTTP w celu uzyskania strony sieci Web, będziesz mieć CInternetSession
obiekt, dwa CInternetConnection
obiekty (jeden będzie a CFtpSession
drugi to CHttpSession
), i dwa CInternetFile
obiekty (po jednym dla każdego połączenia). Jeśli użyto wartości domyślnych dla parametrów dwContext , nie będzie można odróżnić OnStatusCallback
wywołań wskazujących postęp połączenia FTP i wywołań wskazujących postęp połączenia HTTP. Jeśli określisz identyfikator dwContext , który można później przetestować w programie OnStatusCallback
, będzie wiadomo, która operacja wygenerowała wywołanie zwrotne.
Zobacz też
MFC — podstawy programowania Internetu
Rozszerzenia internetowe Win32 (WinInet)