WinInet全称是Win32 Internet Extension,它提供一个通用的网络协议访问接口,包括Gohper、FTP和HTTP。
使用WinInet开发网络应用程序的优点:
1)隐藏协议细节,简化编程:可不必深入了解协议。像使用WinSocket编程需要理解网络通信及协议基本原理;
2)熟悉编程接口:WinInet API函数和很多WinAPI函数相似;
3)稳定性好,不要求程序与底层直接联系:WinInet隐藏了协议的具体细节,使得程序不必直接使用各种协议;
4)支持数据缓存:WinInet函数为所有的协议提供缓存能力,程序员只需关心数据而不用去管理数据缓存;
5)支持多线程:由于WinInet函数在内部处理多线程的并发问题,因此WinInet函数支持多线程,在多线程中可以调用各种WinInet函数而不用担心发生问题或死锁。
WinInet类是一个总称,目前的版本中分为四组:
1)CInternetSession类:
直接继承自CObject类,用来建立与某个Internet服务器的会话。还可以向代理服务器描述连接,如果应用程序所使用的Internet连接必须保持一段时间,则可以在CWinApp类中创建相应的CInternetSession成员。CInternetSession类的成员函数如下:
QueryOption //提供一个可能的错误检测判断
SetOption //设置Internet会话的选项
OpenURL //设置URL,并对其进行分析
GetFtpConnection //打开一个FTP会话并进行连接
GetHttpConnection //打开HTTP服务器并进行连接
GetGopherConnection //打开Gopher服务器并进行连接
EnableStatusCallback //建立异步操作的状态回调
ServiceTypeFromHandle //通过Internet句柄返回服务器类型
GetContext //获取Internet和应用程序会话句柄
Close //关闭Internet连接
2)CInternetConnection类:
包括CInternetConnection类及其派生类:
CInternetConnection //管理与Internet服务器的连接
CHttpConnection //管理与HTTP服务器的连接
CFtpConnection //管理与FTP服务器的连接,可以对服务器上的文件和目录进行直接操作
CGopherConnection //管理与Gopher服务器的连接
3)CFileFind类:
包括CFileFind类及其派生类CFtpFileFind、CGopherFileFind类。CFileFind类直接继承于CObject类,这些类实现对本地和远程系统上的文件的搜索和定位工作:
CFileFind //对文件检索提供支持
CFtpFileFind //为在FTP服务器上进行的文件检索操作提供支持
CGopherFileFind //为在Gopher服务器上进行的文件检索操作提供支持
4)CInternetFile类和CGopherLocator类:
CInternetFile类包括CInternetFile类及其派生类CHttpFile、CGopherFile,这些类实现对远程系统上的文件的存取操作。
CInternetFile //允许对使用Internet协议的远程系统中的文件进行操作
CGopherFile //为在Gopher服务器上进行文件检索和读取操作提供支持
CHttpFile //提供对HTTP服务器上的文件进行操作的支持
在从Gopher服务器中获取信息之前,必须先获得该服务器的定位器,CGopherLocator类的主要功能就是从Gopher服务器中得到定位并确定定位器的类型。
WinInet有以下三个全局函数:
1)AfxParseURL:
AfxParseURL全局函数用于解析一个URL字符串,并返回服务类型:
BOOL AFXAPI AfxParseURL(
LPCTSTR pstrURL, //指向要解析的URL字符串的指针
DWORD& dwServiceType, //指定Internet的服务类型,如AFX_INET_SERVICE_FTP
//AFX_INET_SERVICE_HTTP、AFX_INET_SERVICE_HTTPS…
CString& strServer, //解析出来的主机字符串
CString& strObject, //解析出来的URL内容字符串
INTERNET_PORT& nPort //端口号(由Server或Object段指定的)
);
如果一个URL解析成功则返回非0值;如果为空URL或者不包含已知的服务类型则返回0值。
例如用AfxParseURL解析URL:service://server/dir/dir/object.ext:port,执行成功后得到的值:
strServer == “server”
strObject ==“/dir/dir/object.ext”
nPort == #port
dwServiceType == #service
2)AfxGetInternetHandleType:
AfxGetInternetHandleType函数用于获取指定的Internet句柄的网络服务类型,这些返回网络服务类型在AFXINET.H中定义:
DWORD AFXAPI AfxGetInternetHandleType(
HINTERNET hQuery //Internet查询的句柄
);
如果Handle为空或服务类型无法识别,则返回AFX_INET_SERVICE_UNK。
成功则返回相应的服务类型,如INTERNET_HANDLE_TYPE_INTERNET、INTERNET_HANDLE_TYPE_CONNECT_HTTP…
3)AfxThrowInternetException:
AfxThrowInternetException函数用于抛出一个Internet异常:
void AFXAPI AfxThrowInternetException(
DWORD dwContext, //引起异常的操作的上下文标识
DWORD dwError = 0 //引起异常的错误
);
编写支持Internet的应用程序的一般步骤:
1)创建一个CInternetSession对象
由于Internet会话是通过CInternetConnection类的对象实现的,因此首先要创建一个CInternetSession对象,建立一个Internet会话;
2)建立与服务器的连接
客户应用程序要与服务器协同工作,在创建了CInternetSession对象后,就需要建立到服务器的连接,根据协议的不同,可选:GetFtpConnetction、GetHttpConnection、GetGopherConnection。
3)查询或设置Internet选项
在连接时,有时还要查询或设置Internet选项,这个工作可以通过QueryOption或SetOption函数来完成。
4)向用户反馈当前数据处理的进程信息
有时客户的应用程序在进行某些操作时,要耗费较长时间,因此需要向用户反馈当前的状态,这个工作由EnableStatusCallback函数来完成,此时还要重载OnStatusCallBack函数来实现回调函数的功能。
5)创建CInternetFile实例
调用CInternetSession类的成员函数OpenURL来建立与服务器的连接,函数返回一个CInternetFile指针。
6)文件读写操作
调用CInternetFile::Read或CInternetFile::Write函数对所得到的服务器文件进行读写操作。
7)异常处理
为提高应用程序的可靠性和容错性,必须对可能出现的问题进行处理,这种处理通常是调用CInternetException类的对象对目前可知的异常进行处理。
8)结束
调用CInternetSession::Close结束会话并销毁CInternetSession对象。