每個 Internet 客戶端程式都有特定的目的行為——讀檔、寫檔、刪除檔案等。實現這些行為的先決條件是建立 Internet 連線,再根據不同目的執行具體操作。以下整理針對不同應用行為所需的具體操作步驟,內容參考 MSDN 並補充關鍵細節。
| 目的 | 方法 | 結果 |
|---|---|---|
| 開始 Internet Session | 建立 CInternetSession 物件 | 初始化 WinInet,連接伺服器 |
| 讀取/設定 Internet 查詢選項(如逾時、重試次數) | 呼叫 CInternetSession::SetOption | 失敗回傳 FALSE |
| 建立回呼函式監控 Session 狀態 | 呼叫 CInternetSession::EnableStatusCallback,建立回呼函式,覆寫 OnStatusCallback | 建立自訂回呼常式 |
| 存取 Internet/Intranet 伺服器或本地檔案 | 呼叫 CInternetSession::OpenURL | 解析並開啟至指定伺服器連線,回傳 CStdioFile(本地檔案)或 CInternetFile 物件,透過存取該物件取得資料 |
| 讀取檔案 | 呼叫 CInternetFile::Read | 使用提供的緩衝區讀取指定位元組數 |
| 異常處理 | 在 CInternetException 類別中處理 | 處理所有常見 Internet 異常類型 |
| 結束 Internet Session | 處理 CInternetSession 物件 | 自動清理開啟的控制代碼與連線 |
| 目的 | 方法 | 結果 |
|---|---|---|
| 開始 FTP 會話,建立 FTP 連線 | 建立 CInternetSession,呼叫 GetFtpConnection | 初始化 WinInet 並連接伺服器 |
| 連接到 FTP Server | 使用 CInternetSession::GetFtpConnection | 回傳 CFtpConnection 物件 |
| 切換至 FTP 伺服器新目錄 | 呼叫 CFtpConnection::SetCurrentDirectory | 進入 FTP 伺服器指定目錄 |
| 尋找第一個 FTP 目錄檔案 | 建立 CFtpFileFind,呼叫 FindFile | 尋找第一個檔案,未找到回傳 FALSE |
| 列舉所有資源,尋找下一個檔案 | 呼叫 CFtpFileFind::FindNextFile 直到回傳 FALSE | 尋找下一個檔案,未找到回傳 FALSE |
| 開啟找到的檔案(讀/寫) | 呼叫 CFtpConnection::OpenFile,參數為檔名 | 建立並開啟 CInternetFile 物件 |
| 讀取檔案 | 以讀模式開啟,呼叫 CInternetFile::Read | 使用指定緩衝區讀取資料 |
| 寫入檔案 | 以寫模式開啟,呼叫 CInternetFile::Write,覆寫 OnStatusCallback | 使用指定緩衝區寫入資料 |
| 變更客戶端在伺服器上的目錄 | 呼叫 CFtpConnection::SetCurrentDirectory | 進入新目錄 |
| 取得客戶端在伺服器上的目前目錄 | 呼叫 CFtpConnection::GetCurrentDirectory | 取得目錄資訊 |
| 異常處理 | 使用 CInternetException 類別 | 處理所有常見 Internet 異常 |
| 結束 FTP Session | 處理 CInternetSession 物件 | 自動清理開啟的控制代碼與連線 |
| 目的 | 方法 | 結果 |
|---|---|---|
| 開始 FTP Session | 建立 CInternetSession 物件 | 初始化 WinInet 並連接伺服器 |
| 連接到 FTP Server | 使用 CInternetSession::GetFtpConnection | 回傳 CFtpConnection 物件 |
| 檢查 FTP 目錄是否正確 | 呼叫 GetCurrentDirectory 或 GetCurrentDirectoryAsURL | 回傳目錄名稱或目錄 URL |
| 切換至 FTP 伺服器新目錄 | 呼叫 CFtpConnection::SetCurrentDirectory | 進入 FTP 伺服器新目錄 |
| 尋找第一個檔案 | 使用 CFtpFileFind::FindFile | 尋找第一個檔案,未找到回傳 FALSE |
| 尋找下一個檔案 | 使用 CFtpFileFind::FindNextFile | 尋找下一個檔案,未找到回傳 FALSE |
| 刪除找到的檔案 | 呼叫 CFtpConnection::Remove,參數為檔名 | 刪除指定檔案 |
| 異常處理 | 使用 CInternetException 類別 | 處理所有常見 Internet 異常 |
| 結束 FTP Session | 處理 CInternetSession 物件 | 自動清理開啟的控制代碼與連線 |
| 目的 | 方法 | 結果 |
|---|---|---|
| 開始 HTTP 會話,建立 HTTP 連線 | 建立 CInternetSession,呼叫 GetHttpConnection | 初始化 WinInet 並連接伺服器,回傳 CHttpConnection 物件 |
| 建立 HTTP 請求 | 呼叫 CHttpConnection::OpenRequest | 建立 CHttpFile 物件並回傳 |
| 發送 HTTP 請求 | 呼叫 CHttpFile::AddRequestHeaders 及 SendRequest | 發送請求至伺服器 |
| 尋找檔案 | (同 FTP 流程) | 未找到回傳 FALSE |
| 讀取檔案 | 呼叫 CInternetFile::Read | 使用提供的緩衝區讀取指定位元組 |
| 取得 HTTP 請求資訊 | 呼叫 CHttpFile::QueryInfo | 從伺服器取得 HTTP 要求標頭資訊 |
| 異常處理 | 使用 CInternetException 類別 | 處理所有常見 Internet 異常 |
| 結束 HTTP 會話 | 處理 CInternetSession 物件 | 自動清理開啟的控制代碼與連線 |
受限於篇幅,本文未提供完整範例程式碼。MSDN 提供兩個經典範例專案可供參考:FTPTREE(FTP 目錄樹瀏覽)與 TEAR(HTTP 內容擷取)。此外,以 "WinInet" 為關鍵字在 Google 搜尋也能找到大量 MFC WinInet 技術資料與社群分享的實作經驗。
EnableStatusCallback 監控長時間傳輸進度CInternetException 並解析錯誤碼SetOption 設定 INTERNET_OPTION_PROXY 參數