网络编程实用教程第4章.ppt
《网络编程实用教程第4章.ppt》由会员分享,可在线阅读,更多相关《网络编程实用教程第4章.ppt(43页珍藏版)》请在三一办公上搜索。
1、第4章 WinInet编程,WinInet是Windows Internet扩展应用程序高级编程接口,是专为开发具有Internet功能的客户端应用程序而提供的。WinInet有两种形式:WinInet API包含一个C语言的函数集(Win32 Internet functions);MFC WinInet类层次则是对前者的面向对象的封装。WinInet支持FTP、HTTP、Gopher协议。使用WinInet可以使客户端应用程序轻松地与这三种服务器通信,而无需考虑底层通信细节。,4.1 使用WinInet API的共性问题,使用WinInet API,应用程序可以与Internet服务器建立
2、连接、查询或接收服务器文件、向服务器发送文件、打开服务器上的文件,等等。进行操作时可以使用同步方式或异步方式。WinInet API的函数原型定义在Wininet.h头文件中,对应的函数实现在Wininet.lib库文件中。要想成功地编译使用WinInet API的应用程序,正在使用的C/C+的include目录中必须有Wininet.h头文件,library目录中必须有Wininet.lib库文件。,4.1.1 WinInet API函数使用的HINTERNET句柄HINTERNET句柄是一种特殊的数据类型,由少数WinInet API函数创建,大多数WinInet API函数通过使用HIN
3、TERNET类型的句柄来实现函数的操作。HINTERNET句柄可以代表Internet会话,也可以代表应用程序与Internet上特定服务器的连接,还可以代表各种打开的文件或查询结果。HINTERNET句柄与普通的Win32句柄相似。区别在于处于不同层次的HINTERNET句柄形成了一个树形体系,且只有少数函数能够创建HINTERNET句柄。,图4.1 各种HINTERNET句柄形成的树形体系结构,各种HINTERNET句柄都有相应的数据结构,记录句柄的属性信息,并提供通过该句柄可以实现的操作。下层句柄是由上层句柄派生出来的,下层句柄继承上层句柄的属性。当用户调用InternetCloseHa
4、ndle函数来关闭一个句柄时,由该句柄派生的所有下层句柄都将被关闭。HINTERNET句柄有许多选项,这些选项决定了句柄的行为和属性,如句柄的操作方式、超时设置、异步操作时的回调函数、环境上下文ID、缓冲区大小等。句柄的类型不同,选项也不同。应用程序可以调用InternetQueryOption函数来查询句柄的选项设置,调用InternetSetOption函数来改变句柄的选项设置。,图4.2 依赖由InternetOpenUrl所创建句柄的三个函数,4.1.2 典型的操作流程和它们使用的句柄1.使用InternetOpenUrl直接打开因特网上指定的文件,2FTP操作的层级结构(1)对FTP
5、服务器的目录和文件进行操作,图4.3 对FTP服务器的目录和文件进行操作的流程,(2)使用内存缓冲区来操作FTP服务器上的文件.,图4.4 使用内存缓冲区来操作FTP服务器上的文件,(3)查询FTP服务器上的文件,图4.5 查询FTP服务器上的文件,4.1.3 如何获取WinInet API函数执行的错误信息从函数的返回值来说,WinInet API主要有两种类型。一种函数的返回值类型是HINTERNET句柄型;一种函数的返回值类型是布尔型。应用程序可以根据函数执行后的返回值来判断函数的执行是否成功。对于前一种函数,当函数执行成功时,返回一个有效的句柄;当函数失败时,则返回NULL。对于后一种
6、函数,当函数执行成功时,返回TRUE;当函数失败时,返回FALSE。在函数调用失败后,用户往往需要了解出错的具体原因,应用程序可以随即调用GetLastError函数来获取更具体的错误信息。,4.1.4 关于返回信息的缓冲区参数许多WinInet API函数使用两个参数来向应用程序返回信息。lpszBuffer是指向数据缓冲区的指针(LPVOID lpszBuffer),可以为NULL。lpdwBufferLength是指向缓冲区长度的指针(LPDWORD lpdwBufferLength),它在函数开始执行时指示缓冲区的大小,不能为NULL。,函数执行完毕时,作为函数的出口参数,返回一个长度
7、可变的信息。若调用成功lpszBuffer指向的缓冲区中存储着返回的信息内容。lpdwBufferLength所指的双字就被设置为实际存入缓冲区的数据的字节长度。若lpszBuffer指针为NULL,或lpdwBufferLength指示的缓冲区大小不足以容纳返回的数据,函数调用将失败,并在函数返回时将lpdwBufferLength所指的值设置为接受返回数据所需的缓冲区字节数。用户可以使用这个返回值,重新分配一个更大的缓冲区,并重新调用函数。,4.1.5 WinInet API的异步操作模式WinInet API的函数在进行I/O操作时,默认的方式是同步操作,即对于每一个不能及时完成的I/O
8、操作,会一直等下去,直到操作完成。异步操作,无论成功与否函数调用都会立即返回,这样就允许一个单线程的应用程序最充分地利用CPU,而不必等待网络I/O的完成。当调用异步操作模式的函数时,应检查返回值。若函数调用返回FALSE或NULL,并且调用GetLastError返回一个ERROR_IO_PENDING错误,说明该函数调用已经异步的完成了。并且当函数执行完毕时,会使用INTERNET_STATUS_REQUEST_COMPLETE状态码来自动的调用应用程序的回调函数。,为了使WinInet以异步方式操作,应用程序需要做四件事。设置异步方式标志在调用InternetOpen函数来创建Inern
9、et根句柄时,将参数dwFlags设置为INTERNET_FLAG_ASYNC异步标志。这表示接下来针对根句柄及其派生句柄的操作都以异步方式进行。任何调用在异步结束后均返回一个对话句柄或由此而派生的句柄。,设置非零的环境值WinInet中创建句柄的函数都有一个称为环境值的入口参数,名字总是dwContext。如果要求针对某个句柄的函数以异步的方式来操作,在调用创建该句柄的函数时,对dwContext参数必须指定一个非零的环境值。如果把环境值指定为0,即使在上一步操作中设置了INTERNET_FLAG_ASYNC标志,依赖该句柄的函数也只能以同步方式来操作。,定义并实现一个状态回调函数(stat
10、us callback function)对于长时间操作的WinInet函数,回调函数可以给应用程序返回一些关于操作进展情况的反馈,并主要是与网络操作有关的情况。eg:解析了一个域名、正在连接服务器、正在接收数据异步操作完成时将调用回调函数,给出某种指示.INTERNET_STATUS_HANDLE_CLOSING是对于一个句柄最后做的状态指示;INTERNET_STATUS_HANDLE_CREATED是当句柄初始创建时的指示;INTERNET_STATUS_REQUEST_COMPLETE是当一个异步操作完成时的指示。当接收到一个INTERNET_STATUS_REQUEST_COMPLE
11、TE指示时,应用程序必须检查INTERNET_ASYNC_RESULT结构,来决定操作是成功还是失败。,为句柄注册有效的回调函数通过调用InternetSetStatusCallback函数可以建立一个回调函数与一个句柄的关联,称为注册。一旦建立了这种关联,所有对于这个句柄的异步操作就都调用这个回调函数,产生状态指示,汇报函数的操作情况。回调函数被该句柄派生的句柄继承,对于其派生句柄的异步操作也都将调用这个回调函数。使用InternetSetStatusCallback函数也可以改变一个句柄关联的回调函数,但是改变了一个句柄关联的回调函数并不改变其派生句柄的关联回调函数.异步操作在调用回调函数
12、时,会将所操作的句柄创建时指定的非零环境值,以及对这个句柄操作的状态指示等信息,作为入口参数传递给回调函数,利用传入的环境值,可以核查向回调函数产生调用的操作,从而判别出这此回调是哪个异步操作引起的,进而做出不同的处理。,4.1.6 回调函数的定义实现与注册1回调函数的原型VOID(CALLBACK*INTERNET_STATUS_CALLBACK)(IN HINTERNET hInternet,IN DWORD dwContext,IN DWORD dwInternetStatus,IN LPVOID lpvStatusInformation,IN DWORD dwStatusInforma
13、tionLength);,2INTERNET_ASYNC_RESULT结构的定义此结构包含异步回调函数的结果。typedef struct DWORD dwResult;DWORD dwError;INTERNET_ASYNC_RESULT,*LPINTERNET_ASYNC_RESULT;,3注册句柄的回调函数调用InternetSetStatusCallback函数可以建立回调函数与句柄的关联。INTERNET_STATUS_CALLBACK InternetSetStatusCallback(IN HINTERNET hInternet,IN INTERNET_STATUS_CALLBA
14、CK lpfnInternetCallback);,4举例下面给出了一个回调函数的例子,和一个调用InternetSetStatusCallback来注册回调函数的例子./定义了一个回调函数,函数名是用户自己定义的。voidCALLBACKCInternet:InternetCallback(HINTERNET hInternet,/其它参数原样照抄DWORD dwcontext,DWORD dwInternetStatus,LPVOID lpvStatusInformation,DWORD dwStatusInformationLength)/在这里插入回调函数的实现代码。.;/定义INTE
15、RNET_STATUS_CALLBACK型的变量INTERNET_STATUS_CALLBACK dwISC;/建立句柄与回调函数的关联dwISC=InternetSetStatusCallback(hInternet,(INTERNET_STATUS_CALLBACK)InternetCallback);,4.2 使用WinInet API编制FTP客户程序的要点,4.2.1 一般步骤FTP客户端应用程序的一般步骤是:调用InternetAttemptConnect函数测试主机与Internet的连接状态;调用InternetOpen函数,创建HINTERNET会话根句柄;创建FTP会话句柄
16、,调用函数时需要服务器名、FTP端口号、用户名和口令,设置INTERNET_SERVICE_FTP标志,若将端口号设置为HINTERNT_INVALID_PORT_NUMBER,则使用默认端口号;对于FTP服务器执行需要的操作:,对于FTP服务器执行需要的操作:搜寻并列举FTP服务器上的文件和目录使用FtpFindFirstFile和InternetFindNextFile函数。查知或改变FTP服务器的当前目录使用FtpGetCurrentDirectory和FtpSetCurrentDirectory函数。操作服务器上的目录使用FtpCreateDirectory和FtpRemoveDire
17、ctory函数.下载FTP服务器中的文件使用FtpOpenFile和InternetReadFile函数下载和上传文件使用FtpGetFile和FtpPutFile函数。,4.2.2 搜寻并列举FTP服务器上的文件和目录使用FTP的主要目的是操作文件,经常要在FTP服务器上查找符合一定条件的目录或文件,称为目录列举.符合条件的对象可能有很多,需要使用两个WinInet函数才能把所有的都搜索出来。首先,调用FtpFindFirstFile函数,找到服务器上第一个匹配的文件或目录,并返回一个HINTERNET句柄。在此基础上,可以使用这个句柄,反复调用InternetFindNextFile函数,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 实用教程
链接地址:https://www.31ppt.com/p-5452637.html