Bagikan melalui


Dasar-Dasar WinInet

Anda dapat menggunakan WinInet untuk menambahkan dukungan FTP untuk mengunduh dan mengunggah file dari dalam aplikasi Anda. Anda dapat mengambil alih OnStatusCallback dan menggunakan parameter dwContext untuk memberikan informasi kemajuan kepada pengguna saat Anda mencari dan mengunduh file.

Artikel ini berisi topik berikut:

Kutipan kode di bawah ini menunjukkan cara membuat browser sederhana, mengunduh halaman Web, FTP file, dan mencari file gopher. Mereka tidak dimaksudkan sebagai contoh lengkap dan tidak semuanya berisi penanganan pengecualian.

Untuk informasi tambahan tentang WinInet, lihat Win32 Internet Extensions (WinInet).

Membuat Browser yang Sangat Sederhana

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

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

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

Gunakan OnStatusCallback

Saat menggunakan kelas WinInet, Anda dapat menggunakan anggota OnStatusCallback dari objek CInternetSession aplikasi Anda untuk mengambil informasi status. Jika Anda mendapatkan objek Anda sendiri CInternetSession , mengambil alih OnStatusCallback, dan mengaktifkan panggilan balik status, MFC akan memanggil fungsi Anda OnStatusCallback dengan informasi kemajuan tentang semua aktivitas dalam sesi Internet tersebut.

Karena satu sesi mungkin mendukung beberapa koneksi (yang, selama masa pakainya, mungkin melakukan banyak operasi berbeda), OnStatusCallback perlu mekanisme untuk mengidentifikasi setiap perubahan status dengan koneksi atau transaksi tertentu. Mekanisme tersebut disediakan oleh parameter ID konteks yang diberikan kepada banyak fungsi anggota di kelas dukungan WinInet. Parameter ini selalu berjenis DWORD dan selalu diberi nama dwContext.

Konteks yang ditetapkan ke objek Internet tertentu hanya digunakan untuk mengidentifikasi aktivitas penyebab objek di OnStatusCallback anggota CInternetSession objek. Panggilan untuk OnStatusCallback menerima beberapa parameter; parameter ini bekerja sama untuk memberi tahu aplikasi Anda kemajuan apa yang telah dibuat untuk transaksi dan koneksi mana.

Saat membuat CInternetSession objek, Anda dapat menentukan parameter dwContext ke konstruktor. CInternetSessionitu sendiri tidak menggunakan ID konteks; sebaliknya, ini meneruskan ID konteks ke objek yang berasal dari Internet Koneksi ion yang tidak secara eksplisit mendapatkan ID konteksnya sendiri. Pada gilirannya, objek tersebut CInternetConnection akan meneruskan ID konteks ke CInternetFile objek yang mereka buat jika Anda tidak secara eksplisit menentukan ID konteks yang berbeda. Jika, di sisi lain, Anda menentukan ID konteks tertentu milik Anda sendiri, objek dan pekerjaan apa pun yang dilakukannya akan dikaitkan dengan ID konteks tersebut. Anda dapat menggunakan ID konteks untuk mengidentifikasi informasi status apa yang diberikan kepada Anda dalam fungsi Anda OnStatusCallback .

Tampilkan Informasi Kemajuan Saat Mentransfer File

Misalnya, jika Anda menulis aplikasi yang membuat koneksi dengan server FTP untuk membaca file dan juga terhubung ke server HTTP untuk mendapatkan halaman Web, Anda akan memiliki CInternetSession objek, dua CInternetConnection objek (satu akan menjadi dan CFtpSession yang lainnya akan menjadi CHttpSession), dan dua CInternetFile objek (satu untuk setiap koneksi). Jika Anda menggunakan nilai default untuk parameter dwContext , Anda tidak akan dapat membedakan antara OnStatusCallback pemanggilan yang menunjukkan kemajuan untuk koneksi FTP dan pemanggilan yang menunjukkan kemajuan untuk koneksi HTTP. Jika Anda menentukan ID dwContext , yang nantinya dapat Anda uji di OnStatusCallback, Anda akan mengetahui operasi mana yang menghasilkan panggilan balik.

Baca juga

Dasar-Dasar Pemrograman Internet MFC
Ekstensi Internet Win32 (WinInet)