《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对象。

 

 

 

 

你可能感兴趣的:(service,HTTP服务器,服务器,FTP服务器,mfc,internet)