用WinInet開發Internet用戶端應用指南

來源:互聯網
上載者:User

用WinInet開發Internet用戶端應用指南(一)

編譯/NorthTibet

一、概述

   

一個Internet用戶端程式的目的是通過Internet協議如:HTTP、FTP等來存取網路資料來源(伺服器)的資訊。用戶端程式可以訪問伺服器獲
得象天氣預報,股票價格、重要新聞資料,甚至是與伺服器交換資訊。Internet用戶端程式可以通過外部網路(Internet)或內部網路(一般為
Intranet)訪問伺服器。
    為了開發Internet用戶端程式。MFC類庫提供了專門的 Win32 Internet
擴充介面,也就是WinInet。MFC將WinInet封裝在一個標準的、便於使用的類集合中。在編寫WinInet用戶端程式時,你既可以直接調用
Win32函數,也可以使用WinInet類庫。
    Win32 Internet
擴充提供了對普通Internet協議的訪問,這些協議包括:HTTP、FTP和Gopher。Gopher已經漸漸淡出。藉助於WinInet編程接
口,開發人員不必去瞭解Winsock、TCP/IP和特定Internet協議的細節就可以編寫出高水平的Internet用戶端程式。WinInet
為所有幾種協議(HTTP、FTP和Gopher)提供了統一的函數集,也就是Win32

API介面。利用這些統一的函數集,大大簡化了針對HTTP、FTP等協議的編程,從而輕鬆地將Internet整合到自己的應用程式中。底層協議的轉換
(如從FTP到HTTP)只要對原始碼稍作修改就可以完成。
    在Visual C++工程中提供有兩種方式來使用WinInet。一種是直接調用Win32
Internet函數,另一種是使用WinInet類庫。
    MFC對WinInet的封裝是通過提供三個由CStdioFile衍生類別實現的。這三個衍生類別是:CInternetFile、
CHttpFile 和
CGopherFile。由於Gopher協議已經很少使用,所以本文將不再對CGopherFile進行討論。對開發人員來說,不管你以前是否用過
CStdioFile,WinInet都是很好理解並且便於使用的。它使得存取Internet資料易如反掌,使得Internet資料和本機資料的處理
一致透明,資料的儲存位置已經不再重要。

MFC WinInet 類有如下優點:

  • 緩衝器輸入輸出
  • 資料的型別安全處理
  • 許多函數的參數都是預設值
  • 對普通的Internet錯誤進行異常處理
  • 自動清除開啟的控制代碼和串連

使用 WinInet 提供的API函數,你可以:

  • 通過HTTP協議下載HTML頁,HTTP協議是專門用於在伺服器和客戶瀏覽器之間傳輸HTML頁。
  • 發送FTP請求上傳或下載檔案以及擷取伺服器的目錄資訊。通過匿名登陸下載檔案便是FTP的典型應用。
  • 其它基於HTTP、FTP協議的應用。

使用 WinInet 的一般流程為:

        圖一

下表描述了一個Internet用戶端程式實現的一般步驟:
(表一)

實現 方法
建立一個串連 建立CInternetSession對象,它是WinInet Internet客戶應用的前提條件
開啟一個URL 建立一個串連,調用CInternetSession::OpenURL
函數,返回一個唯讀資來源物件
讀取 URL 資料 開啟一個URL,調用CInternetSession::QueryOption
查詢 Internet 選項設定 建立一個串連,調用CInternetFile::Read
設定一個Internet選項 建立一個串連,調用CInternetSession::SetOption
設定一個用狀態資訊調用的函數 建立一個串連,調用CInternetSession::EnableStatusCallback
重寫CInternetSession::OnStatusCallback函數
關閉串連 用CInternetSession對象方法,清除開啟的串連

為了建立Internet用戶端程式,MFC提供了如下的C++類和全程函數:

C++類

CInternetSession (父類 CObject)CInternetConnection (父類 CObject)    CFtpConnection    CGopherConnection    CHttpConnectionCInternetFile(父類 CStdioFile)    CGopherFile    CHttpFileCFileFind(父類 CObject)    CFtpFileFind    CGopherFileFindCGopherLocator(父類 CObject)CInternetException(父類 CException)      

全程函數:

AfxParseURLAfxGetInternetHandleTypeAfxThrowInternetException    

   

這些類和全程函數除CFileFind在AFX.H裡聲明之外,其餘都在AFXINET.H檔案裡聲明。它們對HTTP、FTP和Gopher等協議進行
了高度抽象,形成了一套進階API函數。

利用這些API可以快速直接地開發Internet應用。例如,串連到FTP伺服器一般需要幾個步驟,而且需要做一些底層處理。但使用上述的MFC類提供
的API,只需要對CInternetSession::GetFTPConnection進行一次調用,便可以輕鬆建立串連。
   
大家知道,每一個Internet應用其資料交換都是建立在Internet會話(Session)的基礎之上的,MFC是通過
CInternetSession類對象來實現Internet會話的。用這個類不僅可以建立會話,而且可以建立幾個並發的Internet會話。
   
為了與伺服器進行通訊,除了要建立CInternetSession對象之外,還必須建立CInternetConnection對象,針對不同的協議,CInternetConnection對象有三種類型:

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

這些函數調用並不會讀寫伺服器上的檔案。如果你想要讀寫資料,必須要開啟檔案才能操作。其處理流程應該是這樣的:

  • 首先建立 CInternetSession 對象執行個體
  • 如果建立的Session要讀寫檔案,則必須建立 CInternetFile
    對象執行個體(或者是它的子類CHttpFile、CGopherFile
    對象執行個體)。其實,讀取資料最容易的方式是調用 CInternetSession::OpenURL函數。

    這個函數解析你提供的統一資源定位器(URL),然後開啟與URL指定的伺服器串連,同時返回一個唯讀CInternetFile對象。
    CInternetSession::OpenURL不針對特定的協議類型——不管是FTP還是HTTP都可以調用,它甚至可以處理本地檔案,此時返回的
    是CStdioFile,而不是CInternetFile。
     

  • 如果建立的Session不讀寫檔案,而是要實現其它的任務,如刪除某個FTP目錄下的檔案等,則你不需要建立CInternetFile執行個體。

建立CInternetFile對象的方法有兩種:

  • 如果用CInternetSession::OpenURL建立與伺服器的串連,調用返回CStdioFile。
  • 如果用CInternetSession::GetFtpConnection、GetGopherConnection
    或者CHttpConnection::OpenRequest建立與伺服器的串連,你必須調用相應的
    CFtpConnection::OpenFile、CGopherConnection::OpenFile或者
    CHttpConnection::OpenRequest,返回的內容也與CInternetFile、CGopherFile或者CHttpFile
    對應。

    綜上所述,實現Internet用戶端應用的步驟因協議而異。要看你是建立基於OpenURL的一般Internet用戶端應用,還是使用GetXXXConnection函數之一針對特定協議的Internet用戶端應用。

    在後繼文章中我們將進一步討論用WinInet實現Internet用戶端應用程式的具體步驟和細節。

二、實現步驟

   

大家知道,每個Internet用戶端程式都伴隨有一定的目的行為,如讀檔案、寫檔案、刪除檔案等等。用戶端的程式要實現這些行為的先決條件是建立
Internet串連。然後再根據不同的目的進行具體的操作。為了方便起見,下面這這些張表格針對不同的應用行為列出了所需要的具體操作。其中列出了一般
的Internet
URL (FTP、或者
HTTP)用戶端行為要實現某個目標所必須使用的方法。這張表格的內容來自MSDN。我對部分我認為重要的地方做了補充。

(表一)一個典型的Internet用戶端程式的處理流程

目的 方法 結果
開始一個Internet session 建立 CInternetSession 對象 初始化WinInet,並串連伺服器
讀取或設定 InternetQuery 選項 (如逾時或重試次數) 調用 CInternetSession::SetOption 不成功返回FALSE
建立回呼函數監視session狀態 調用CInternetSession::EnableStatusCallback
建立回呼函數
CInternetSession::OnStatusCallback,重寫OnStatusCallback,建立自己的回調常式
Internet伺服器Intranet伺服器或本地檔案 調用 CInternetSession::OpenURL 解析並開啟到指定伺服器的串連,返回CStdioFile(如果你傳遞的OpenURL是本地檔案名稱)或CInternetFile對象,通過存取這個對象,獲得伺服器或檔案的資料
讀檔案 調用 CInternetFile::Read 用你提供的Buffer讀指定的位元組數
異常處理 在 CInternetException 類中處理 處理所有普通的 Internet 異常類型
結束 Internet session 處理 CInternetSession對象 自動清除開啟的控制代碼的串連


(表二)典型的 FTP 用戶端程式實現的一般步驟

目的 方法 結果
開始一個FTP會話,建立一個FTP串連 建立一個CInternetSession對象,調用CInternetSession::GetFtpConnection 初始化WinInet
並聯結伺服器
串連到一個FTP Server 用CInternetSession::GetFtpConnection 返回一個CFtpConnection對象
CD到 FTP 伺服器的一個新目錄 用CFtpConnection::SetCurrentDirectory CD到FTP伺服器的一個
新目錄
Find 第一個FTP目錄中的檔案 建立一個CFtpFileFind對象,調用CFtpFileFind::FindFile,OpenURL函數返回一個唯讀資來源物件;調用CFtpFileFind::FindFile Find第一個檔案,如果檔案每找到返回FALSE
枚舉所有可獲得的資源,Find下一個FTP目錄中的檔案 Find下一個資源,調用CFtpFileFind::FindNextFile直到返回FALSE。 Find下一個檔案
如果檔案沒找到返回FALSE
開啟FindFile或FindNextFile找到的檔案(用於讀寫) 調用CFtpConnection::OpenFile,參數為FindFile或FindNextFile返回的檔案名稱
,建立並開啟一個CInternetFile對象
開啟FindFile或FindNextFile找到的檔案(用於讀寫),返回一個CInternetFile對象
讀寫檔案 以讀方式開啟FTP檔案,用CInternetFile::Read 使用你指定的緩衝讀
指定的位元組數
寫FTP檔案 以寫方式開啟FTP檔案,調用CInternetFile::Write,重寫CInternetSession::OnStatusCallback 使用你指定的緩衝寫
指定的位元組數
改變用戶端在伺服器上的目錄 調用CFtpConnection::SetCurrentDirectory 進入新的目錄
擷取用戶端在伺服器上的目前的目錄 調用CFtpConnection::GetCurrentDirectory 擷取目錄資訊
異常處理 用CInternetException類  處理所有普通的Internet異常類型
結束FTP session 處理CInternetSession對象 自動清除開啟的控制代碼的串連


(表三)顯示了一個典型的刪除檔案的FTP用戶端應用要實現的一般步驟:

目的 方法 結果
開始一個FTP session 建立一個CInternetSession對象 初始化WinInet
並聯結伺服器
串連到一個FTP Server 用CInternetSession::GetFtpConnection 返回一個CFtpConnection對象
檢查FTP目錄是否正確 用CFtpConnection::GetCurrentDirectory或CFtpConnection::GetCurrentDirectoryAsURL 返回目錄名字
伺服器目錄或返回目錄的URL
CD(改變目錄)到 FTP 伺服器的一個新目錄 用CFtpConnection::SetCurrentDirectory CD到FTP伺服器的一個
新目錄
Find 第一個FTP目錄中的檔案 用CFtpFileFind::FindFile Find第一個檔案,如果檔案每找到返回FALSE
Find 下一個FTP目錄中的檔案 用CFtpFileFind::FindNextFile Find下一個檔案
如果檔案沒找到返回FALSE
刪除FindFile或FindNextFile找到的檔案  用CFtpConnection::Remove用FindFile或FindNextFile返回的檔案名稱 刪除FindFile或FindNextFile
找到的檔案    
異常處理 用CInternetException類  處理所有普通的Internet異常類型
結束FTP session 處理CInternetSession對象 自動清除開啟的控制代碼的串連

(表四)顯示了實現一個典型的 HTTP 用戶端應用程式的一般步驟:

目的 方法 結果
開始HTTP會話,建立HTTP串連 建立 CInternetSession對象,調用CInternetSession::GetHttpConnection
建立CHttpConnection對象
初始化WinInet並聯結伺服器,返回一個CHttpConnection對象
建立一個 HTTP 要求 調用CHttpConnection::OpenRequest
建立一個CHttpFile對象;
返回一個CHttpFile對象
發送一個HTTP 要求 用CHttpFile::AddRequestHeaders 並且用CHttpFile::SendRequest Find一個檔案
如果檔案沒找到返回FALSE
讀檔案 調用CInternetFile::Read 使用你提供的緩衝讀指定的位元組
擷取HTTP請求資訊 調用CHttpFile::QueryInfo 從伺服器擷取HTTP要求標頭資訊
異常處理 利用CInternetException類 處理所有普通的Internet異常類型
結束 HTTP 會話 處理CInternetSession對象 自動清除開啟的控制代碼的串連

   由於時間關係,我沒有寫本文的例子代碼。不過MSDN裡有兩個簡單的例子可以參考,一個是FTPTREE,另一個是TEAR。此外,也可以用“WinInet”作為關鍵字在google裡搜一下也能找到一些使用MFC
WinInet的技術資訊。(完)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.