WinInet

WinInet(“Windows Internet”)API幫助程式設計師使用三個常見的Internet協定,這三個協定是用於World Wide Web全球資訊網的超文本傳輸協定(HTTP:Hypertext Transfer Protocol)、檔案傳輸協定(FTP:File Transfer Protocol)和另一個稱為Gopher的檔案傳輸協定。WinInet函式的語法與常用的Win32 API函式的語法類似,這使得使用這些協定就像使用本地硬碟上的檔案一樣容易。

WinInet

Internet傳輸協定

WinInet API的檔案位於/Platform SDK/Internet, Intranet, Extranet Services/Internet Tools and Technologies/WinInet API。

請參見 MSDN For VS 2005的詳細資訊:

Microsoft provides many APIs for programming both client and server applications. Many new applications are being written for the Internet, and as technologies, browser capabilities, and security options change, new types of applications will be written. Browsers run on client computers, providing access to the World Wide Web and displaying HTML pages that contain text, graphics, ActiveX controls, and documents. Servers provide FTP, HTTP, and gopher services, and run server extension applications using CGI and ISAPI. Your custom application can retrieve information and provide data on the Internet....

深入剖析 WinInet

1、Linux的Socket資料

2、EPOLL的資料

3、 HTTP SERVER 的資料

4、深入windows 原始碼

WinInet 概述

⊙ Hinternet 句柄的層次關係

⊙ HTTP 函式層次關係

⊙ 典型的 HTTP 客戶端程式的處理流程

1、普通 WinInet 處理函式

⊙ InternetOpen 初始化 WinInet.dll

⊙ InternetOpenUrl 打開 Url,讀取數據

⊙ InternetAttemptConnect 嘗試建立到 Internet 的連線

⊙ InternetConnect 建立 Internet 的連線

⊙ InternetCheckConnection 檢查 Internet 的連線是否能夠建立

⊙ InternetSetOption 設定一個 Internet 選項

⊙ InternetSetStausCallback 安裝一個回調函式,供 API 函式調用

⊙ InternetQueryOption 查詢在一個指定句柄上的 Internet 選項

⊙ InternetQueryDataAvailable 查詢可用數據的數量

⊙ InternetReadFile(Ex) 從一個打開的句柄讀取數據

⊙ InternetFindNextFile 繼續檔案搜尋

⊙ InetrnetSetFilePointer 為 InternetReadFile 設定一個檔案位置

⊙ InternetWriteFile 將數據寫到一個打開的 Internet 檔案

⊙ InternetLockRequestFile 允許用戶為正在使用的檔案加鎖

⊙ InternetUnlockRequestFile 解鎖被鎖定的檔案

⊙ InternetTimeFromSystemTime 根據指定的 RFC 格式格式化日期和時間

⊙ InternetTimeToSystemTime 將一個 HTTP 時間/日期字串格式化為 SystemTime 結構對象

⊙ InternetConfirmZoneCrossing 檢查在安全 URL 和非安全 URL 間的變化

⊙ InternetCloseHandle 關閉一個單一的 Internet 句柄

⊙ InternetErrorDlg 顯示錯誤信息對話框

⊙ InternetGetLastResponesInfo 獲取最近傳送的 API函式的錯誤

2、HTTP 處理函式

⊙ HttpOpenRequest 打開一個 HTTP 請求的句柄

⊙ HttpSendRequert(Ex) 向 HTTP 伺服器傳送指定的請求

⊙ HttpQueryInfo 查詢有關一次 HTTP 請求的信息

⊙ HttpEndRequest 結束一個 HTTP 請求

⊙ HttpAddRequestHeaders 添加一個或多個 HTTP 請求報頭到 HTTP請求句柄

3、FTP 處理函式

⊙ FtpCreateDirectory 在 Ftp 伺服器新建一個目錄

⊙ FtpDelectFile 刪除存儲在 Ftp 伺服器上的檔案

⊙ FtpFindFirstFile 查找給定 Ftp 會話中的指定目錄

⊙ FtpGetCurrentDirectory 為指定 Ftp 會話獲取當前目錄

⊙ FtpGetFile 從 Ftp 伺服器下載檔案

⊙ FtpOpenFile 訪問一個遠程檔案以對其進行讀寫

⊙ FtpPutFile 向 Ftp 伺服器上傳檔案

⊙ FtpRemoveDirectory 在 Ftp 伺服器刪除指定的檔案

⊙ FtpRenameFile 為 Ftp 伺服器上的指定檔案改名

⊙ FtpSetCurrentDirectory 更改在 Ftp 伺服器上正在使用的目錄

本文排版格式為

正文由視窗自動換行;所有代碼以 80 字元為邊界;中英文字元以空格符分隔。

正文

WinInet 層關係

1、WinInet 是一個網路編程接口,包含了 Internet 底層協定 HTTP,FTP。

2、藉助 WinInet 接口,可不必去了解 Winsock、TCP/IP 和特定 Internet 協定

的細節就可以編寫出高水平的 Internet 客戶端程式。

3、WinInet 為 HTTP、FTP 提供了統一的函式集,也就是 Win32 API 接口。

4、WinInet 簡化了 HTTP、FTP 協定的編程,可輕鬆地將 Internet 集成到應用程式中。

Hinternet 句柄的層次關係

1、首先通過 InternetOpen 函式創建位於根部的 Hinternet 句柄,

然後才能通過其進一步建立 HTTP、FTP 的連線。

2、使用 InternetConnect 函式創建一個指定的連線,它將通過傳遞給它的參數為指定的

站點初始化 HTTP、FTP 連線並創建一個從根句柄分支出去的 Hinernet 句柄。

3、HttpOpenRequest 和 FtpOpenFile、FtpFindFirstFile等函式將使用 InternetConnect

所創建的句柄以建立到指定站點的連線。

HTTP 函式層次關係

1、對於 WWW 伺服器提供的資源可以直接通過 InternetOpenUrl 或是 HTTP 函式對潛在

的協定進行處理來訪問。

2、由於 HTTP 協定是在不斷發展的,當這些底層協定被更新後也將影響這些 HTTP 函式行為

3、InternetOpen、InternetConnect、HttpOpenRequest 將返回 Hinternet 句柄,而

HttpAddRequestHeaders、HttpQueryInfo、HttpSendRequest、HttpSendRequestEx、

InternetErrorDlg 將使用它們所依靠的這些函式創建的 Hinternet句柄。

FTP 函式層次關係

1、FTP 函式需要請求得到特定類型的 Hinternet句柄才能正常工作,這些句柄的創建

必須按一定次序來進行:

1、首先使用 InternetOpen 創建根句柄,然後才能通過 InternetConnect 創建一個

FTP連線句柄

2、該圖展示了依賴於 InternetConnect 所返回FTP 連線句柄的 FTP函式之間的層次關係。

典型的 HTTP 客戶端程式的處理流程

1、目的:開始 HTTP會話,建立 HTTP 連線

方法:InetrnetOpen、

InternetAttemptConnect

InternetConnect

結果:初始化 WinInet.dll 並聯接伺服器,返回相應的句柄

2、目的:創建一個 HTTP請求

方法:HttpOpenRequest

結果:

3、目的:傳送一個 HTTP請示

方法:HttpAddRequestHeaders

HttpSendRequest(Ex)

結果:

4、目的:讀檔案

方法:InternetReadFile(Ex)

結果:使用你提供的緩衝讀指定的位元組

5、目的:獲取 HTTP請求信息

方法:HttpQueryInfo

結果:從伺服器獲取 HTTP 請求頭信息

6、目的:異常處理

方法:InternetGetLastResponesInfo

InternetErrorDlg

結果:處理所有普通的異常類型

7、目的:結束 HTTP 會話

方法:HttpEndRequest、

InternetCloseHandle

結果:自動清除打開的句柄的連線

InetrnetOpen 初始化

1、聲明:

function InternetOpen(lpszAgent: PChar;

dwAccessType: DWORD;

lpszProxy,

lpszProxyBypass:PChar;

dwFlags: DWORD): HINTERNET; stdcall;

2、參數:

1、lpszAgent 應用程式名,可以自定義

2、dwAccessType 存取類型,可以是:

①INTERNET_OPEN_TYPE_PRECONFIG =0 使用 IE 中的連線設定

②INTERNET_OPEN_TYPE_DIRECT =1 直接連線到伺服器

③INTERNET_OPEN_TYPE_PROXY =3 通過代理伺服器進行連線

為 3 時需指定代理伺服器地址

3、lpszProxy CERN 代理伺服器地址,一般設定為 null;

4、lpszProxyBypass 代理伺服器地址;

5、dwFlags 標記,一般設定為 0,可以是:

①INTERNET_FLAG_DONT_CACHE 不在快取中保存取得的內容

②INTERNET_FLAG_OFFLINE 脫機方式

InternetOpenUrl 打開 Url,讀取數據

1、聲明:

function InternetOpenUrl(hInet: HINTERNET;

lpszUrl: PChar;

lpszHeaders: PChar;

dwHeadersLength: DWORD;

dwFlags: DWORD;

dwContext: DWORD): HINTERNET; stdcall;

2、參數:

1、hInet 由 InternetOpen 返回的句柄

2、lpszUrl 檔案 Url 地址,以 http:,ftp:打頭的 Url 地址;

3、lpszHeaders 傳送到伺服器的數據頭;

4、dwHeadersLength 傳送到伺服器的數據頭長度

5、dwFlags 標記,可以是:

①INTERNET_FLAG_RELOAD 強制重讀數據

②INTERNET_FLAG_DONT_CACHE 不保存到快取

③INTERNET_FLAG_TRANSFER_ASCII 使用文本數據

④INTERNET_FLAG_TRANSFER_BINARY 使用二進制數據

6、dwContext 上下文標記,如果使用回調功能時這個值將傳送給回調函式

Internet 的連線

1、聲明:

function InternetConnect(hInet: HINTERNET;

lpszServerName: PChar;

nServerPort: INTERNET_PORT;

lpszUsername: PChar;

lpszPassword: PChar;

dwService: DWORD;

dwFlags: DWORD;

dwContext: DWORD): HINTERNET; stdcall;

2、參數:

1、hInet 由 InternetOpen 返回的句柄

2、lpszServerName 伺服器的地址

HTTP 地址必須為伺服器名作InternetOpenUrl 語法分析

3、nServerPort HTTP協定連線埠號(預設80)

4、lpszUsername 用戶名

5、lpszPassword 用戶密碼

6、dwService 決定服務類型 HTTP,FTP,可以是:

①INTERNET_SERVICE_FTP = 1; 連線到一個 FTP 伺服器上

②INTERNET_SERVICE_HTTP = 3; 連線到一個 HTTP 伺服器上

7、dwFlags

8、dwContext

HttpOpenRequest

1、聲明:

function HttpOpenRequest(hConnect: HINTERNET;

lpszVerb: PChar;

lpszObjectName: PChar;

lpszVersion: PChar;

lpszReferrer: PChar;

lplpszAcceptTypes: PLPSTR;

dwFlags: DWORD;

dwContext: DWORD): HINTERNET; stdcall;

2、參數:

1、hConnect InternetConnect句柄

2、lpszVerb 命令字,如果為 NULL,使用預設值“GET”

3、lpszObjectName 命令對象,通常是一個檔案名稱、執行檔或是一個搜尋列表

4、lpszVersion HTTP版本,如果為空,將使用“HTTP/1.0”

5、lpszReferrer 一個網址,可以為空

6、lplpszAcceptTypes中 程式接收的檔案類型列表。把空值傳給該函式即通知了伺服器只有文本檔案可以被接收

'application/octet-stream'

7、dwFlags 標誌 使用 or 連線標誌

①INTERNET_FLAG_NO_CACHE_WRITE 標誌不緩衝寫

②INTERNET_FLAG_KEEP_CONNECTION 保持連線

③INTERNET_FLAG_SECURE { use PCT/SSL if applicable (HTTP) }

{ Security Ignore Flags, Allow HttpOpenRequest to overide

Secure Channel (SSL/PCT) failures of the following types. }

④INTERNET_FLAG_IGNORE_CERT_CN_INVALID { bad common name in X509 Cert. }

⑤INTERNET_FLAG_IGNORE_CERT_DATE_INVALID { expired X509 Cert. }

8、dwContext Integer(Self)?

向 HTTP 伺服器傳送指定的請求

1、聲明:

function HttpSendRequest(hRequest: HINTERNET;

lpszHeaders: PChar;

dwHeadersLength: DWORD;

lpOptional: Pointer;

dwOptionalLength: DWORD): BOOL; stdcall;

2、參數:

1、hRequest HttpOpenRequest句柄

2、lpszHeaders 服務請求的數據頭

3、dwHeadersLength 服務請求的數據頭的長度

4、lpOptional 緊跟在標題後任意數據的地址,此參數一般用於 POST 和 PUT 操作

5、dwOptionalLength 數據的長度

InternetSetOption 設定一個 Internet 選項

1、聲明

function InternetSetOption(hInet: HINTERNET;

dwOption: DWORD;

lpBuffer: Pointer;

dwBufferLength: DWORD): BOOL; stdcall;

2、參數:

1、hInet 句柄

2、dwOption Internet 選項,可以是:

①INTERNET_OPTION_SEND_TIMEOUT 設定,傳送請求和連線時的逾時時間

②INTERNET_OPTION_RECEIVE_TIMEOUT 設定,接收請求和連線時的逾時間間

3、lpBuffer 值

4、dwBufferLength 值大小

相關詞條

相關搜尋

熱門詞條

聯絡我們