WinInet
WinInet(“Windows Internet”)API帮助程式设计师使用三个常见的Internet协定,这三个协定是用于World Wide Web全球资讯网的超文本传输协定(HTTP:Hypertext Transfer Protocol)、档案传输协定(FTP:File Transfer Protocol)和另一个称为Gopher的档案传输协定。WinInet函式的语法与常用的Win32 API函式的语法类似,这使得使用这些协定就像使用本地硬碟上的档案一样容易。
基本介绍
- 外文名:WinInet
- 全称:Windows Interne
- 定义:三个常见的Internet协定
- 领域:计算机
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 值大小