首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

WinInet 開發 Internet 客戶端應用程式完全指南(上)

     編輯:關於VC++

前言

Internet 客戶端程式的核心任務,是透過 HTTP、FTP 等標準協定,從網路上的資料源(伺服器)存取資訊。無論是查詢天氣預報、股價即時行情、重要新聞資料,抑或是與伺服器雙向交換資訊,客戶端程式都能輕鬆勝任。這些應用既可跨越外部網路(Internet),也能在內部網路(Intranet)環境下運作。

WinInet 技術概覽

為了簡化 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),僅需微調原始碼即可完成。

Visual C++ 專案中的兩種使用方式

  • 直接呼叫 Win32 Internet 函式:適合需要精細控制底層行為的場景
  • 使用 MFC WinInet 類別庫:提供更高層級的抽象,開發效率更高

MFC WinInet 核心類別架構

MFC 透過三個由 CStdioFile 衍生的類別實現 WinInet 封裝:

  • CInternetFile:基底網路檔案類別
  • CHttpFile:專門處理 HTTP 協定
  • CGopherFile:處理 Gopher 協定(已較少使用,本文不再詳細討論)

對開發者而言,無論您過去是否使用過 CStdioFile,WinInet 都相當直觀易懂。它讓存取網路資料如同操作本地檔案般簡單,實現了網路資料與本地資料處理的一致性與透明度——資料儲存的實際位置不再重要。

MFC WinInet 類別的主要優勢

  • 緩衝區輸入/輸出支援
  • 資料型別安全處理
  • 大量函式參數提供預設值
  • 針對常見 Internet 錯誤提供例外處理機制
  • 自動清理開啟的控制代碼與連線

WinInet API 的核心應用場景

  • HTTP 協定:下載 HTML 網頁、與 Web 伺服器互動
  • FTP 協定:上傳/下載檔案、取得伺服器目錄資訊、匿名登入下載
  • 其他基於 HTTP/FTP 的應用:REST API 呼叫、檔案同步等

WinInet 程式設計標準流程

WinInet 程式設計流程圖

圖一:WinInet 客戶端應用程式實作流程

Internet 客戶端程式實作關鍵步驟

實作目的方法結果
建立連線建立 CInternetSession 物件WinInet 客戶應用程式的前提條件
開啟 URL呼叫 CInternetSession::OpenURL建立連線,回傳唯讀資源物件
讀取 URL 資料呼叫 CInternetFile::Read讀取指定位元組數到緩衝區
查詢 Internet 選項呼叫 CInternetSession::QueryOption取得逾時、重試次數等設定
設定 Internet 選項呼叫 CInternetSession::SetOption配置連線參數
設定狀態回呼函式呼叫 CInternetSession::EnableStatusCallback,覆寫 OnStatusCallback監控連線狀態變化
關閉連線處理 CInternetSession 物件自動清理開啟的控制代碼與連線

MFC 提供的核心 C++ 類別與全域函式

核心類別:

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 Session 與 Connection 物件模型

每個 Internet 應用的資料交換都建立在 Internet 會話基礎上,MFC 透過 CInternetSession 類別物件實現會話管理,支援建立多個並發會話。

與伺服器通訊除建立 CInternetSession 外,還需建立 CInternetConnection 物件。針對不同協定,連線物件有三種類型:

  • CInternetSession::GetFtpConnection
  • CInternetSession::GetHttpConnection
  • CInternetSession::GetGopherConnection

這些函式呼叫本身不會讀寫伺服器檔案。若需讀寫資料,必須開啟檔案進行操作。標準處理流程如下:

  1. 建立 CInternetSession 物件實例
  2. 若需讀寫檔案,建立 CInternetFile 實例(或其子類 CHttpFile、CGopherFile)。最簡單的讀取方式是呼叫 CInternetSession::OpenURL,該函式會解析提供的 URL,開啟與指定伺服器的連線,並回傳唯讀的 CInternetFile 物件。OpenURL 不針對特定協定——FTP、HTTP 均可呼叫,甚至能處理本地檔案(此時回傳 CStdioFile 而非 CInternetFile)
  3. 若不需讀寫檔案(如刪除 FTP 目錄下檔案),則無需建立 CInternetFile 實例

建立 CInternetFile 物件的兩種途徑

  1. 透過 CInternetSession::OpenURL:建立連線並回傳 CStdioFile
  2. 透過協定專用連線函式:使用 CInternetSession::GetFtpConnection、GetGopherConnection 或 CHttpConnection::OpenRequest,再呼叫對應的 CFtpConnection::OpenFile、CGopherConnection::OpenFile 或 CHttpConnection::OpenRequest,分別回傳 CInternetFile、CGopherFile 或 CHttpFile 物件

綜上所述,Internet 客戶端應用的實作步驟因協定而異,取決於您是建立基於 OpenURL 的通用應用,還是使用 GetXXXConnection 針對特定協定的應用。後續文章將進一步探討具體實作細節與程式碼範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved