深入剖析 WinInet
1,、Linux的Socket資料
2,、EPOLL的資料
3、 HTTP SERVER 的資料
4,、深入windows 源代碼
目錄
===============================================================================
⊙ WinInet 概述
⊙ Hinternet 句柄的層次關(guān)系
⊙ HTTP 函數(shù)層次關(guān)系
⊙ 典型的 HTTP 客戶端程序的處理流程
1,、普通 WinInet 處理函數(shù)
⊙ InetrnetOpen 初始化 WinInet.dll
⊙ InternetOpenUrl 打開 Url,讀取數(shù)據(jù)
⊙ InternetAttemptConnect 嘗試建立到 Internet 的連接
⊙ InternetConnect 建立 Internet 的連接
⊙ InternetCheckConnection 檢查 Internet 的連接是否能夠建立
⊙ InternetSetOption 設(shè)置一個(gè) Internet 選項(xiàng)
⊙ InternetSetStausCallback 安裝一個(gè)回調(diào)函數(shù),,供 API 函數(shù)調(diào)用
⊙ InternetQueryOption 查詢?cè)谝粋€(gè)指定句柄上的 Internet 選項(xiàng)
⊙ InternetQueryDataAvailable 查詢可用數(shù)據(jù)的數(shù)量
⊙ InternetReadFile(Ex) 從一個(gè)打開的句柄讀取數(shù)據(jù)
⊙ InternetFindNextFile 繼續(xù)文件搜尋
⊙ InetrnetSetFilePointer 為 InternetReadFile 設(shè)置一個(gè)文件位置
⊙ InternetWriteFile 將數(shù)據(jù)寫到一個(gè)打開的 Internet 文件
⊙ InternetLockRequestFile 允許用戶為正在使用的文件加鎖
⊙ InternetUnlockRequestFile 解鎖被鎖定的文件
⊙ InternetTimeFromSystemTime 根據(jù)指定的 RFC 格式格式化日期和時(shí)間
⊙ InternetTimeToSystemTime 將一個(gè) HTTP 時(shí)間/日期字串格式化為 SystemTime 結(jié)構(gòu)對(duì)象
⊙ InternetConfirmZoneCrossing 檢查在安全 URL 和非安全 URL 間的變化
⊙ InternetCloseHandle 關(guān)閉一個(gè)單一的 Internet 句柄
⊙ InternetErrorDlg 顯示錯(cuò)誤信息對(duì)話框
⊙ InternetGetLastResponesInfo 獲取最近發(fā)送的 API函數(shù)的錯(cuò)誤
2,、HTTP 處理函數(shù)
⊙ HttpOpenRequest 打開一個(gè) HTTP 請(qǐng)求的句柄
⊙ HttpSendRequert(Ex) 向 HTTP 服務(wù)器發(fā)送指定的請(qǐng)求
⊙ HttpQueryInfo 查詢有關(guān)一次 HTTP 請(qǐng)求的信息
⊙ HttpEndRequest 結(jié)束一個(gè) HTTP 請(qǐng)求
⊙ HttpAddRequestHeaders 添加一個(gè)或多個(gè) HTTP 請(qǐng)求報(bào)頭到 HTTP請(qǐng)求句柄
3、FTP 處理函數(shù)
⊙ FtpCreateDirectory 在 Ftp 服務(wù)器新建一個(gè)目錄
⊙ FtpDelectFile 刪除存儲(chǔ)在 Ftp 服務(wù)器上的文件
⊙ FtpFindFirstFile 查找給定 Ftp 會(huì)話中的指定目錄
⊙ FtpGetCurrentDirectory 為指定 Ftp 會(huì)話獲取當(dāng)前目錄
⊙ FtpGetFile 從 Ftp 服務(wù)器下載文件
⊙ FtpOpenFile 訪問(wèn)一個(gè)遠(yuǎn)程文件以對(duì)其進(jìn)行讀寫
⊙ FtpPutFile 向 Ftp 服務(wù)器上傳文件
⊙ FtpRemoveDirectory 在 Ftp 服務(wù)器刪除指定的文件
⊙ FtpRenameFile 為 Ftp 服務(wù)器上的指定文件改名
⊙ FtpSetCurrentDirectory 更改在 Ftp 服務(wù)器上正在使用的目錄
===============================================================================
本文排版格式為:
正文由窗口自動(dòng)換行,;所有代碼以 80 字符為邊界,;中英文字符以空格符分隔。
(作者保留對(duì)本文的所有權(quán)利,未經(jīng)作者同意請(qǐng)勿在在任何公共媒體轉(zhuǎn)載,。)
(作者:匯編 QQ 241897582,。)
正文
===============================================================================
⊙ WinInet 概述
===============================================================================
1、WinInet 是一個(gè)網(wǎng)絡(luò)編程接口,,包含了 Internet 底層協(xié)議 HTTP,,F(xiàn)TP,。
2,、借助 WinInet 接口,可不必去了解 Winsock,、TCP/IP 和特定 Internet 協(xié)議
的細(xì)節(jié)就可以編寫出高水平的 Internet 客戶端程序,。
3、WinInet 為 HTTP,、FTP 提供了統(tǒng)一的函數(shù)集,,也就是 Win32 API 接口。
4,、WinInet 簡(jiǎn)化了 HTTP,、FTP 協(xié)議的編程,可輕松地將 Internet 集成到應(yīng)用程序中,。
===============================================================================
⊙ Hinternet 句柄的層次關(guān)系
===============================================================================
1,、首先通過(guò) InternetOpen 函數(shù)創(chuàng)建位于根部的 Hinternet 句柄,
然后才能通過(guò)其進(jìn)一步建立 HTTP,、FTP 的連接,。
2、使用 InternetConnect 函數(shù)創(chuàng)建一個(gè)指定的連接,,它將通過(guò)傳遞給它的參數(shù)為指定的
站點(diǎn)初始化 HTTP,、FTP 連接并創(chuàng)建一個(gè)從根句柄分支出去的 Hinernet 句柄。
3,、HttpOpenRequest 和 FtpOpenFile,、FtpFindFirstFile等函數(shù)將使用 InternetConnect
所創(chuàng)建的句柄以建立到指定站點(diǎn)的連接。
===============================================================================
⊙ HTTP 函數(shù)層次關(guān)系
===============================================================================
1,、對(duì)于 WWW 服務(wù)器提供的資源可以直接通過(guò) InternetOpenUrl 或是 HTTP 函數(shù)對(duì)潛在
的協(xié)議進(jìn)行處理來(lái)訪問(wèn),。
2、由于 HTTP 協(xié)議是在不斷發(fā)展的,,當(dāng)這些底層協(xié)議被更新后也將影響這些 HTTP 函數(shù)行為
3,、InternetOpen、InternetConnect,、HttpOpenRequest 將返回 Hinternet 句柄,,而
HttpAddRequestHeaders、HttpQueryInfo、HttpSendRequest,、HttpSendRequestEx,、
InternetErrorDlg 將使用它們所依靠的這些函數(shù)創(chuàng)建的 Hinternet句柄。
===============================================================================
⊙ FTP 函數(shù)層次關(guān)系
===============================================================================
1,、FTP 函數(shù)需要請(qǐng)求得到特定類型的 Hinternet句柄才能正常工作,,這些句柄的創(chuàng)建
必須按一定次序來(lái)進(jìn)行:
1、首先使用 InternetOpen 創(chuàng)建根句柄,,然后才能通過(guò) InternetConnect 創(chuàng)建一個(gè)
FTP連接句柄
2,、該圖展示了依賴于 InternetConnect 所返回FTP 連接句柄的 FTP函數(shù)之間的層次關(guān)系。
===============================================================================
⊙ 典型的 HTTP 客戶端程序的處理流程
===============================================================================
1,、目的:開始 HTTP會(huì)話,,建立 HTTP 連接
方法:InetrnetOpen、
InternetAttemptConnect
InternetConnect
結(jié)果:初始化 WinInet.dll 并聯(lián)接服務(wù)器,,返回相應(yīng)的句柄
2,、目的:創(chuàng)建一個(gè) HTTP請(qǐng)求
方法:HttpOpenRequest
結(jié)果:
3、目的:發(fā)送一個(gè) HTTP請(qǐng)示
方法:HttpAddRequestHeaders
HttpSendRequert(Ex)
結(jié)果:
4,、目的:讀文件
方法:InternetReadFile(Ex)
結(jié)果:使用你提供的緩沖讀指定的字節(jié)
5,、目的:獲取 HTTP請(qǐng)求信息
方法:HttpQueryInfo
結(jié)果:從服務(wù)器獲取 HTTP 請(qǐng)求頭信息
6、目的:異常處理
方法:InternetGetLastResponesInfo
InternetErrorDlg
結(jié)果:處理所有普通的異常類型
7,、目的:結(jié)束 HTTP 會(huì)話
方法:HttpEndRequest,、
InternetCloseHandle
結(jié)果:自動(dòng)清除打開的句柄的連接
===============================================================================
⊙ 典型的 HTTP 客戶端程序的處理流程
===============================================================================
===============================================================================
⊙ InetrnetOpen 初始化 WinInet.dll
===============================================================================
1、聲明:
function InternetOpen(lpszAgent: PChar;
dwAccessType: DWORD;
lpszProxy,
lpszProxyBypass:PChar;
dwFlags: DWORD): HINTERNET; stdcall;
2,、參數(shù):
1,、lpszAgent 應(yīng)用程序名,可以自定義
2,、dwAccessType 存取類型,,可以是:
1、INTERNET_OPEN_TYPE_PRECONFIG =0 使用 IE 中的連接設(shè)置
2,、INTERNET_OPEN_TYPE_DIRECT =1 直接連接到服務(wù)器
3,、INTERNET_OPEN_TYPE_PROXY =3 通過(guò)代理服務(wù)器進(jìn)行連接
為 3 時(shí)需指定代理服務(wù)器地址
3、lpszProxy CERN 代理服務(wù)器地址,,一般設(shè)置為 nill;
4,、lpszProxyBypass 代理服務(wù)器地址;
5,、dwFlags 標(biāo)記,,一般設(shè)置為 0,可以是:
1,、INTERNET_FLAG_DONT_CACHE 不在緩存中保存取得的內(nèi)容
2,、INTERNET_FLAG_OFFLINE 脫機(jī)方式
===============================================================================
⊙ InternetOpenUrl 打開 Url,讀取數(shù)據(jù)
===============================================================================
1、聲明:
function InternetOpenUrl(hInet: HINTERNET;
lpszUrl: PChar;
lpszHeaders: PChar;
dwHeadersLength: DWORD;
dwFlags: DWORD;
dwContext: DWORD): HINTERNET; stdcall;
2,、參數(shù):
1,、hInet 由 InternetOpen 返回的句柄
2、lpszUrl 文件 Url 地址,,以 http:,,ftp:打頭的 Url 地址;
3,、lpszHeaders 發(fā)送到服務(wù)器的數(shù)據(jù)頭,;
4、dwHeadersLength 發(fā)送到服務(wù)器的數(shù)據(jù)頭長(zhǎng)度
5,、dwFlags 標(biāo)記,,可以是:
1,、INTERNET_FLAG_RELOAD 強(qiáng)制重讀數(shù)據(jù)
2,、INTERNET_FLAG_DONT_CACHE 不保存到緩存
3、INTERNET_FLAG_TRANSFER_ASCII 使用文本數(shù)據(jù)
4,、INTERNET_FLAG_TRANSFER_BINARY 使用二進(jìn)制數(shù)據(jù)
6,、dwContext 上下文標(biāo)記,如果使用回調(diào)功能時(shí)這個(gè)值將傳送給回調(diào)函數(shù)
===============================================================================
⊙ InternetConnect 建立 Internet 的連接
===============================================================================
1,、聲明:
function InternetConnect(hInet: HINTERNET;
lpszServerName: PChar;
nServerPort: INTERNET_PORT;
lpszUsername: PChar;
lpszPassword: PChar;
dwService: DWORD;
dwFlags: DWORD;
dwContext: DWORD): HINTERNET; stdcall;
2,、參數(shù):
1、hInet 由 InternetOpen 返回的句柄
2,、lpszServerName 服務(wù)器的地址
HTTP 地址必須為服務(wù)器名作InternetOpenUrl 語(yǔ)法分析
3,、nServerPort HTTP協(xié)議端口號(hào)(缺省80)
4、lpszUsername 用戶名
5,、lpszPassword 用戶密碼
6,、dwService 決定服務(wù)類型 HTTP,F(xiàn)TP,,可以是:
1,、INTERNET_SERVICE_FTP = 1; 連接到一個(gè) FTP 服務(wù)器上
2、INTERNET_SERVICE_HTTP = 3; 連接到一個(gè) HTTP 服務(wù)器上
7,、dwFlags
8,、dwContext
===============================================================================
⊙ HttpOpenRequest 打開一個(gè) HTTP 請(qǐng)求的句柄
===============================================================================
1、聲明:
function HttpOpenRequest(hConnect: HINTERNET;
lpszVerb: PChar;
lpszObjectName: PChar;
lpszVersion: PChar;
lpszReferrer: PChar;
lplpszAcceptTypes: PLPSTR;
dwFlags: DWORD;
dwContext: DWORD): HINTERNET; stdcall;
2,、參數(shù):
1,、hConnect InternetConnect句柄
2、lpszVerb 命令字,,如果為 NULL,,使用缺省值“GET”
3、lpszObjectName 命令對(duì)象,通常是一個(gè)文件名,、可執(zhí)行文件或是一個(gè)搜索列表
4,、lpszVersion HTTP版本,如果為空,,將使用“HTTP/1.0”
5,、lpszReferrer 一個(gè)網(wǎng)址,可以為空
6,、lplpszAcceptTypes中 程序接收的文件類型列表,。把空值傳給該函數(shù)即通知了服務(wù)器只有文本文件可以被接收
'application/octet-stream'
7、dwFlags 標(biāo)志 使用 or 連接標(biāo)志
1,、INTERNET_FLAG_NO_CACHE_WRITE 標(biāo)志不緩沖寫
2,、INTERNET_FLAG_KEEP_CONNECTION 保持連接
3、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. }
4,、INTERNET_FLAG_IGNORE_CERT_CN_INVALID { bad common name in X509 Cert. }
5,、INTERNET_FLAG_IGNORE_CERT_DATE_INVALID { expired X509 Cert. }
8、dwContext Integer(Self),?
===============================================================================
⊙ HttpSendRequert(Ex) 向 HTTP 服務(wù)器發(fā)送指定的請(qǐng)求
===============================================================================
1,、聲明:
function HttpSendRequest(hRequest: HINTERNET;
lpszHeaders: PChar;
dwHeadersLength: DWORD;
lpOptional: Pointer;
dwOptionalLength: DWORD): BOOL; stdcall;
2、參數(shù):
1,、hRequest HttpOpenRequest句柄
2,、lpszHeaders 服務(wù)請(qǐng)求的數(shù)據(jù)頭
3、dwHeadersLength 服務(wù)請(qǐng)求的數(shù)據(jù)頭的長(zhǎng)度
4,、lpOptional 緊路在標(biāo)題后任意數(shù)據(jù)的地址,,此參數(shù)一般用于 POST 和 PUT 操作
5、dwOptionalLength 數(shù)據(jù)的長(zhǎng)度
===============================================================================
⊙ InternetSetOption 設(shè)置一個(gè) Internet 選項(xiàng)
===============================================================================
1,、聲明
function InternetSetOption(hInet: HINTERNET;
dwOption: DWORD;
lpBuffer: Pointer;
dwBufferLength: DWORD): BOOL; stdcall;
2,、參數(shù):
1、hInet 句柄
2,、dwOption Internet 選項(xiàng),,可以是:
INTERNET_OPTION_SEND_TIMEOUT 設(shè)置,發(fā)送請(qǐng)求和連接時(shí)的超時(shí)時(shí)間
INTERNET_OPTION_RECEIVE_TIMEOUT 設(shè)置,,接收請(qǐng)求和連接時(shí)的超時(shí)間間
3,、lpBuffer 值
4、dwBufferLength 值大小
===============================================================================
⊙ InternetSetOption 設(shè)置一個(gè) Internet 選項(xiàng)
===============================================================================