`

《MFC那点事儿》---WinInet基础

 
阅读更多

WinInet全称是Win32 Internet Extension,它提供一个通用的网络协议访问接口,包括GohperFTPHTTP

使用WinInet开发网络应用程序的优点:

1)隐藏协议细节,简化编程:可不必深入了解协议。像使用WinSocket编程需要理解网络通信及协议基本原理;

2)熟悉编程接口:WinInet API函数和很多WinAPI函数相似;

3)稳定性好,不要求程序与底层直接联系:WinInet隐藏了协议的具体细节,使得程序不必直接使用各种协议;

4)支持数据缓存:WinInet函数为所有的协议提供缓存能力,程序员只需关心数据而不用去管理数据缓存;

5)支持多线程:由于WinInet函数在内部处理多线程的并发问题,因此WinInet函数支持多线程,在多线程中可以调用各种WinInet函数而不用担心发生问题或死锁。

WinInet类是一个总称,目前的版本中分为四组:

1CInternetSession类:

直接继承自CObject类,用来建立与某个Internet服务器的会话。还可以向代理服务器描述连接,如果应用程序所使用的Internet连接必须保持一段时间,则可以在CWinApp类中创建相应的CInternetSession成员。CInternetSession类的成员函数如下:

QueryOption //提供一个可能的错误检测判断

SetOption //设置Internet会话的选项

OpenURL //设置URL,并对其进行分析

GetFtpConnection //打开一个FTP会话并进行连接

GetHttpConnection //打开HTTP服务器并进行连接

GetGopherConnection //打开Gopher服务器并进行连接

EnableStatusCallback //建立异步操作的状态回调

ServiceTypeFromHandle //通过Internet句柄返回服务器类型

GetContext //获取Internet和应用程序会话句柄

Close //关闭Internet连接

2CInternetConnection类:

包括CInternetConnection类及其派生类:

CInternetConnection //管理与Internet服务器的连接

CHttpConnection //管理与HTTP服务器的连接

CFtpConnection //管理与FTP服务器的连接,可以对服务器上的文件和目录进行直接操作

CGopherConnection //管理与Gopher服务器的连接

3CFileFind类:

包括CFileFind类及其派生类CFtpFileFindCGopherFileFind类。CFileFind类直接继承于CObject类,这些类实现对本地和远程系统上的文件的搜索和定位工作:

CFileFind //对文件检索提供支持

CFtpFileFind //为在FTP服务器上进行的文件检索操作提供支持

CGopherFileFind //为在Gopher服务器上进行的文件检索操作提供支持

4CInternetFile类和CGopherLocator类:

CInternetFile类包括CInternetFile类及其派生类CHttpFileCGopherFile,这些类实现对远程系统上的文件的存取操作。

CInternetFile //允许对使用Internet协议的远程系统中的文件进行操作

CGopherFile //为在Gopher服务器上进行文件检索和读取操作提供支持

CHttpFile //提供对HTTP服务器上的文件进行操作的支持

在从Gopher服务器中获取信息之前,必须先获得该服务器的定位器,CGopherLocator类的主要功能就是从Gopher服务器中得到定位并确定定位器的类型。

WinInet有以下三个全局函数:

1AfxParseURL

AfxParseURL全局函数用于解析一个URL字符串,并返回服务类型:

BOOL AFXAPI AfxParseURL(

LPCTSTR pstrURL, //指向要解析的URL字符串的指针

DWORD& dwServiceType, //指定Internet的服务类型,如AFX_INET_SERVICE_FTP

//AFX_INET_SERVICE_HTTPAFX_INET_SERVICE_HTTPS

CString& strServer, //解析出来的主机字符串

CString& strObject, //解析出来的URL内容字符串

INTERNET_PORT& nPort //端口号(ServerObject段指定的)

);

如果一个URL解析成功则返回非0值;如果为空URL或者不包含已知的服务类型则返回0值。

例如用AfxParseURL解析URLservice://server/dir/dir/object.ext:port,执行成功后得到的值:

strServer == server

strObject ==/dir/dir/object.ext

nPort == #port

dwServiceType == #service

2AfxGetInternetHandleType

AfxGetInternetHandleType函数用于获取指定的Internet句柄的网络服务类型,这些返回网络服务类型在AFXINET.H中定义:

DWORD AFXAPI AfxGetInternetHandleType(

HINTERNET hQuery //Internet查询的句柄

);

如果Handle为空或服务类型无法识别,则返回AFX_INET_SERVICE_UNK

成功则返回相应的服务类型,如INTERNET_HANDLE_TYPE_INTERNETINTERNET_HANDLE_TYPE_CONNECT_HTTP

3AfxThrowInternetException

AfxThrowInternetException函数用于抛出一个Internet异常:

void AFXAPI AfxThrowInternetException(

DWORD dwContext, //引起异常的操作的上下文标识

DWORD dwError = 0 //引起异常的错误

);

编写支持Internet的应用程序的一般步骤:

1)创建一个CInternetSession对象

由于Internet会话是通过CInternetConnection类的对象实现的,因此首先要创建一个CInternetSession对象,建立一个Internet会话;

2)建立与服务器的连接

客户应用程序要与服务器协同工作,在创建了CInternetSession对象后,就需要建立到服务器的连接,根据协议的不同,可选:GetFtpConnetctionGetHttpConnectionGetGopherConnection

3)查询或设置Internet选项

在连接时,有时还要查询或设置Internet选项,这个工作可以通过QueryOptionSetOption函数来完成。

4)向用户反馈当前数据处理的进程信息

有时客户的应用程序在进行某些操作时,要耗费较长时间,因此需要向用户反馈当前的状态,这个工作由EnableStatusCallback函数来完成,此时还要重载OnStatusCallBack函数来实现回调函数的功能。

5)创建CInternetFile实例

调用CInternetSession类的成员函数OpenURL来建立与服务器的连接,函数返回一个CInternetFile指针。

6)文件读写操作

调用CInternetFile::ReadCInternetFile::Write函数对所得到的服务器文件进行读写操作。

7)异常处理

为提高应用程序的可靠性和容错性,必须对可能出现的问题进行处理,这种处理通常是调用CInternetException类的对象对目前可知的异常进行处理。

8)结束

调用CInternetSession::Close结束会话并销毁CInternetSession对象。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics