用WinInet开发Internet客户端应用指南

一:http://www.vckbase.com/document/viewdoc/?id=545

二:http://www.vckbase.com/document/viewdoc/?id=546


用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)CFtpConnectionCGopherConnectionCHttpConnection
CInternetFile(父类 CStdioFile)CGopherFileCHttpFile
CFileFind(父类 CObject)CFtpFileFindCGopherFileFind
CGopherLocator(父类 CObject)
CInternetException(父类 CException)      
全程函数:
AfxParseURL
AfxGetInternetHandleType
AfxThrowInternetException    
    这些类和全程函数除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客户端应用程序的具体步骤和细节。(待续)


用WinInet开发Internet客户端应用指南(二)


编译/NorthTibet


二、实现步骤

    大家知道,每个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::SetCurrentDirectoryCD到FTP服务器的一个
新目录
Find 第一个FTP目录中的文件创建一个CFtpFileFind对象,调用CFtpFileFind::FindFile,OpenURL函数返回一个只读资源对象;调用CFtpFileFind::FindFileFind第一个文件,如果文件每找到返回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::SetCurrentDirectoryCD到FTP服务器的一个
新目录
Find 第一个FTP目录中的文件用CFtpFileFind::FindFileFind第一个文件,如果文件每找到返回FALSE
Find 下一个FTP目录中的文件用CFtpFileFind::FindNextFileFind下一个文件
如果文件没找到返回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::SendRequestFind一个文件
如果文件没找到返回FALSE
读文件调用CInternetFile::Read使用你提供的缓冲读指定的字节
获取HTTP请求信息调用CHttpFile::QueryInfo从服务器获取HTTP请求头信息
异常处理利用CInternetException类处理所有普通的Internet异常类型
结束 HTTP 会话处理CInternetSession对象自动清除打开的句柄的连接

   由于时间关系,我没有写本文的例子代码。不过MSDN里有两个简单的例子可以参考,一个是FTPTREE,另一个是TEAR。此外,也可以用“WinInet”作为关键字在google里搜一下也能找到一些使用MFC WinInet的技术信息。(完)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebService的基本概念:java webservice,什么是webservice

WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。 这种技术允许网络上的所有系统进行交互。随着技术的发展,一个Web服务可以包含额外的指定功能并且可以在多个B2B应用中协作通讯。 Web服务可以理解…

掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)。数组高级以及Arrays(掌握)排序方法空间复杂度时间复杂度稳定性插…

关于Android错误 View requires API level 14 (current...

2019独角兽企业重金招聘Python工程师标准>>> 问题描述:在界面配置文件main.xml中,可能用上某些控件(例如GridLayout)遇上下面所说的错误:View requires API level 14(current min is 8), 但将项目clear后,再…

socket-select函数

最近在用socket编程,用到select函数,于是上网查找资料,如下这篇是讲的比较详细易懂的:Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect…

javascript 基础 转

最近面试过一些人, 发现即使经验丰富的开发人员, 对于一些基础的理论和细节也常常会模糊. 写本文是因为就我自己而言第一次学习下面的内容时发现自己确实有所收获和感悟. 其实我们容易忽视的javascript的细节还有更多, 本文仅是冰山一角. 希望大家都能通过本文有所斩获.一. Jav…

从表到里学习JVM实现

在社会化分工、软件行业细分专业化的趋势下,会真的参与到底层系统实现的人肯定是越来越少(比例上说)。真的会参与到JVM实现的人肯定是少数。但如果您对JVM是如何实现的有兴趣、充满好奇,却苦于没有足够系统的知识去深入&#xff0…

2019春第二次课程设计实验报告

2019春第二次课程设计实验报告 一、实验项目名称 用数组实现反弹球消砖块 二、实验项目功能描述 利用键盘按键控制小球方向让小球碰到挡板后反弹上去消除砖块。 三、项目模块结构介绍 四、实现界面展示 五、代码托管链接 https://gitee.com/huangxuannn/events 六、实验总结 上…

[SharePoint 2010] Client Object Model 跨时区查询list item的方法

SharePoint将所有的Datetime类型的数据都以universal的形式(UTC)存储在数据库中,当要在页面上显示类似list item的"Created", "Modified"等时间日期信息时,将数据库中的UTC时间取出来,然后根据当前Site的Regional Settin…

Linux下静态库和动态库的编译连接

http://blog.sina.com.cn/s/blog_4090ba590100t3nu.html .a文件 gcc -c test.c ar rc libtest.a test.o ranlib libtest.a 静态库只要编译出.o文件然后用ar打入包中就可以 动态库或共享库不用libtool工具: gcc -fpic -o test.o -c test gcc -shared -o te…

修改终端服务端口的方法

修改终端服务端口的方法Windows 2000 下的修改办法   win2k的终端服务可以运行在两种方式下:远程管理或应用程序服务器模式。   远程管理模式:允许一定数量的管理员远程管理这个服务器,这个模式对服务器性能的影响程度最低。   应用程序…

PYTHON -c

命令行执行代码转载于:https://www.cnblogs.com/BlueFire-py/p/10957663.html

Linux显示中文乱码解决方法

http://sumit.blog.51cto.com/162317/206698经常使用linux终端,有人上传中文命名的文件显示出中文乱码,下面是解决方法。默认显示的字符编码# echo $LANGen_US.UTF-8修改i18n文件# vi /etc/sysconfig/i18nLANG"zh_CN.GB18030"LANGUAGE"zh…

多行字符串的表示方式

原文载于&#xff1a;http://robinwu.iteye.com/blog/145514 其中最重要的、忽略一切转义字符、多行大包围、相当于的多行版本 1 str <<EOF 2 This isnt a tab: \t 3 and this isnt a newline: \n 4 EOF 5 6 puts str 转载于:https://www.cnblogs.com/kloboh…

nodejs+redis

为什么80%的码农都做不了架构师&#xff1f;>>> redis可以用来管理session http://www.csser.com/board/4f77e6f996ca600f78000936 然后使用的时候redis-server这个服务进程得开着&#xff0c;不然会悲剧的 转载于:https://my.oschina.net/kiloct/blog/137629

Caused by: java.lang.ClassNotFoundException: Cannot find class: User

源代码: <select id"selectAll" resultType"User">select user_id uid,user_name username,user_password password,user_gender gender, user_birthday birthday, user_status status from users</select> 正确代码: <select id"s…

标准C语言库 Glibc 2.15

http://www.oschina.net/p/glibc Glibc 是提供系统调用和基本函数的 C 库&#xff0c;比如open, malloc, printf等等。所有动态连接的程序都要用到它。 Glibc最新更新资讯&#xff0c;共2条 (投递新闻) 1个月前GNU libc 2.15 (Glibc) 发布 2评/952阅 7个月前GLib 2.30.0 发布&…

FxCAD 实验三 实现对象的【属性】事件

接着实验三&#xff0c;本次实验&#xff0c;实现鼠标右键点击【图形对象时】可以弹出一个【WinForm】属性界面 添加一个WindowsForm 界面&#xff0c;如图。类名字&#xff1a;FormBox 回到FxBox类文件 覆盖 SelectEvent 方法&#xff0c;添加上面的代码 运行程序&#xff0c;…

SQL Server文本和图像函数

文本和图像函数 1、查找特定字符串PATINDEX 语法与字符串的patindex一样。 2、获取文本指针TEXTPTR SQLServer在存储文本类型(ntext、text)和图像数据类型(image)时&#xff0c;默认情况是与常见的基本数据类型(如char、int等)这样的数据时单独存储的&#xff0c;也就是说&…

图像的灰度处理

图像的灰度处理的三种方法&#xff1a; 1.imread的方法将像素值修改为0 2.调用一个RGB转灰度的方法实现灰度转化&#xff08;cv2.COLOR_BGR2GRAY&#xff09; 3.R G B 的均值取灰度值来灰度转化&#xff08;原理&#xff09; 处理结果 如下: 转载于:https://www.cnblogs.com/Ja…

在Linux终端下调用可执行文件时总要加上符号./的原因

原网址 : http://blog.csdn.net/snakebite1985/article/details/1638453 刚接触Shell时总感到很奇怪&#xff1a;如果当前的Shell工作目录为/home/Victor/&#xff0c;且此目录下有一个叫做myproc的可执行文件&#xff0c;那么简单的在命令行中输入myproc并回车并不能调用这个…