Internet 客戶端程式的核心任務,是透過 HTTP、FTP 等標準協定,從網路上的資料源(伺服器)存取資訊。無論是查詢天氣預報、股價即時行情、重要新聞資料,抑或是與伺服器雙向交換資訊,客戶端程式都能輕鬆勝任。這些應用既可跨越外部網路(Internet),也能在內部網路(Intranet)環境下運作。
為了簡化 Internet 客戶端的開發,MFC 類別庫提供了 Win32 Internet 擴充介面——WinInet。MFC 將 WinInet 封裝成一組標準、易用的類別集合。開發人員既可直接呼叫 Win32 API 函式,也能善用 MFC WinInet 類別庫進行開發。
Win32 Internet 擴充支援主流的 Internet 協定:HTTP、FTP 與 Gopher(Gopher 現已逐漸淘汰)。有了 WinInet 程式介面,開發者無需深入研究 Winsock、TCP/IP 協定堆疊,以及各協定的底層細節,即可撰寫高水準的客戶端程式。WinInet 為所有支援協定提供了統一的函式集(Win32 API),大幅簡化了針對 HTTP、FTP 等協定的程式設計,讓 Internet 功能輕鬆整合進應用程式中。甚至連底層協定的切換(如從 FTP 改為 HTTP),僅需微調原始碼即可完成。
MFC 透過三個由 CStdioFile 衍生的類別實現 WinInet 封裝:
CInternetFile:基底網路檔案類別CHttpFile:專門處理 HTTP 協定CGopherFile:處理 Gopher 協定(已較少使用,本文不再詳細討論)對開發者而言,無論您過去是否使用過 CStdioFile,WinInet 都相當直觀易懂。它讓存取網路資料如同操作本地檔案般簡單,實現了網路資料與本地資料處理的一致性與透明度——資料儲存的實際位置不再重要。

圖一:WinInet 客戶端應用程式實作流程
| 實作目的 | 方法 | 結果 |
|---|---|---|
| 建立連線 | 建立 CInternetSession 物件 | WinInet 客戶應用程式的前提條件 |
| 開啟 URL | 呼叫 CInternetSession::OpenURL | 建立連線,回傳唯讀資源物件 |
| 讀取 URL 資料 | 呼叫 CInternetFile::Read | 讀取指定位元組數到緩衝區 |
| 查詢 Internet 選項 | 呼叫 CInternetSession::QueryOption | 取得逾時、重試次數等設定 |
| 設定 Internet 選項 | 呼叫 CInternetSession::SetOption | 配置連線參數 |
| 設定狀態回呼函式 | 呼叫 CInternetSession::EnableStatusCallback,覆寫 OnStatusCallback | 監控連線狀態變化 |
| 關閉連線 | 處理 CInternetSession 物件 | 自動清理開啟的控制代碼與連線 |
核心類別:
CInternetSession (基類 CObject)
CInternetConnection (基類 CObject)
CFtpConnection
CGopherConnection
CHttpConnection
CInternetFile (基類 CStdioFile)
CGopherFile
CHttpFile
CFileFind (基類 CObject)
CFtpFileFind
CGopherFileFind
CGopherLocator (基類 CObject)
CInternetException (基類 CException)
全域函式:
AfxParseURL
AfxGetInternetHandleType
AfxThrowInternetException
除 CFileFind 宣告於 AFX.H 外,其餘皆宣告於 AFXINET.H。這些類別與函式對 HTTP、FTP、Gopher 等協定進行高度抽象,形成一套高階 API,讓開發者能快速建構 Internet 應用。例如連接 FTP 伺服器,傳統方式需多個步驟且涉及底層處理,而使用 MFC 類別僅需呼叫 CInternetSession::GetFTPConnection 一次即可輕鬆建立連線。
每個 Internet 應用的資料交換都建立在 Internet 會話基礎上,MFC 透過 CInternetSession 類別物件實現會話管理,支援建立多個並發會話。
與伺服器通訊除建立 CInternetSession 外,還需建立 CInternetConnection 物件。針對不同協定,連線物件有三種類型:
CInternetSession::GetFtpConnectionCInternetSession::GetHttpConnectionCInternetSession::GetGopherConnection這些函式呼叫本身不會讀寫伺服器檔案。若需讀寫資料,必須開啟檔案進行操作。標準處理流程如下:
CInternetSession 物件實例CInternetFile 實例(或其子類 CHttpFile、CGopherFile)。最簡單的讀取方式是呼叫 CInternetSession::OpenURL,該函式會解析提供的 URL,開啟與指定伺服器的連線,並回傳唯讀的 CInternetFile 物件。OpenURL 不針對特定協定——FTP、HTTP 均可呼叫,甚至能處理本地檔案(此時回傳 CStdioFile 而非 CInternetFile)CInternetFile 實例CInternetSession::OpenURL:建立連線並回傳 CStdioFileCInternetSession::GetFtpConnection、GetGopherConnection 或 CHttpConnection::OpenRequest,再呼叫對應的 CFtpConnection::OpenFile、CGopherConnection::OpenFile 或 CHttpConnection::OpenRequest,分別回傳 CInternetFile、CGopherFile 或 CHttpFile 物件綜上所述,Internet 客戶端應用的實作步驟因協定而異,取決於您是建立基於 OpenURL 的通用應用,還是使用 GetXXXConnection 針對特定協定的應用。後續文章將進一步探討具體實作細節與程式碼範例。