书签 分享 收藏 举报 版权申诉 / 153
上传文档赚钱

类型通信网络程序设计章-课件12.ppt

  • 上传人(卖家):ziliao2023
  • 文档编号:7267307
  • 上传时间:2023-11-08
  • 格式:PPT
  • 页数:153
  • 大小:894.50KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《通信网络程序设计章-课件12.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    通信 网络程序设计 课件 12
    资源描述:

    1、1第12章 应用层网络编程12.1 SMTP/POP3协议编程协议编程12.2 HTTP编程编程12.3 FTP编程编程12.4 SNMP编程编程小结小结2网络通信的低层协议开发总是繁琐和复杂的,其根本目标最终还是服务于工作在应用层上的进程,因此应用层网络编程才是终极目标。实现应用层的编程方法大体可以分为两种,即按照应用层协议使用通用编程接口和调用应用层协议专用编程接口。前者是前面花费大量篇幅所介绍知识的深入运用,后者是借助于开发平台提供商对低层接口进行封装的一种便捷手段。本章结合具体的应用层协议,对这两种方法分别进行了介绍。3本章从FTP协议入手,首先采用基于WinSock API的最原始接

    2、口,讲解编程实现SMTP/POP3应用编程;接着使用微软提供的WinInet实现基于HTTP和FTP的应用层协议编程;最后使用SNMP API实现基于SNMP的应用层协议编程。服务器的设计可重点参阅第8章的完成端口技术,本章则更加侧重于客户端的编程。4互联网电子邮件(Electronic Mail,E-mail)提供了快速传递信息的功能,是现在人们在互联网上最常用的远程网络通信工具。在TCP/IP协议中,完成该服务的协议主要是SMTP和POP3。12.1 SMTP/POP3协议编程协议编程512.1.1 SMTP/POP312.1.1 SMTP/POP3协议简介协议简介1 1SMTPSMTPS

    3、MTP(Simple Mail Transfer Protocol),即简单邮件传输协议,它的目标是可靠高效地传送邮件,它独立于传送子系统且仅要求一条可以保证传送数据单元顺序的通道。SMTP的一个重要特点是它能够接力传送邮件,传送服务提供了进程间通信环境(IPCE),此环境可以包括一个网络、几个网络或一个网络的子网。因此,SMTP通常工作在两种情况下:一是电子邮件从客户端传输到服务器;二是从某一个服务器传输到另一个服务器。6SMTP设计基于以下通信模型:针对用户的邮件请求,“发送SMTP进程”与“接收SMTP进程”之间建立一个双向传送通道。接收SMTP的可以是最终接收者,也可以是中间传送者。S

    4、MTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。一旦传送通道建立,SMTP发送者就发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件,则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不终止整个邮件操作),双方将如此重复多次。7当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答。SMTP提供传送邮件的机制,当接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传送服务下时,通过中继S

    5、MTP服务器传送。为了能够给SMTP服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。由此可见,SMTP是一个命令(请求)/响应协议。SMTP命令和响应都是基于ASCII文本的,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码。常见的SMTP命令与响应分别如表12-1和表12-2所示。8表12-1 SMTP的基本命令9表12-2 SMTP服务器响应码10应答码由三位构成,每一位都有特定的意义。第一位应答表示是成功的、失败的或未完成的。通过这一位,不复杂的SMTP发送就可以容易地决定下一步的操作,如果发送方希望大概了解究竟出了什么问题,它可以检测第二位,而第三位则保存了最后更

    6、完整的信息。也就是说,从第一位到第三位,接收方可以一步比一步精确地确定接收方的状态。SMTP是在TCP协议的25号端口监听连接请求的。为了加深对命令(请求)/响应协议以及SMTP的理解,下面列举一个简单的SMTP的连接和发送过程描述:(1)建立TCP连接。11(2)客户端先发送HELO命令以标识发件人自己的身份,然后发送MAIL命令,服务器端以OK作为响应,表明准备接收。(3)客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行,服务器端则表示是否愿意为收件人接受邮件。(4)协商结束,发送邮件,用命令DATA发送。(5)以“.”表示结束输入内容一起发送出去。(6)结束此次

    7、发送,用QUIT命令退出。12表12-3 SMTP会话过程13为了了解编程前服务器端的状态,可以利用Telnet远程登录我们SMTP客户端程序对应的主机观察邮件传输的会话过程。以下是通过Telnet连接SMTP邮件服务器“”发送一封电子邮件的SMTP协议交互过程,其中用户名为“hellowxd”,密码为“888888”。了解了这一交互过程,对于设计SMTP客户端程序具有重要的参考价值,具体如图12-1所示。14图12-1 Telnet连接SMTP服务器15需提请注意的是,目前很多黑客与病毒把SMTP的25端口作为窥探服务器内部或传播病毒的通道,因此25端口上的操作被认为非常危险。为了避免25端

    8、口上的安全隐患,一方面,SMTP服务器增加了身份认证的功能(如前述),另一方面许多安全软件还限制或屏蔽了对远端服务器25端口的连接。为了使得Telnet过程不受影响,除了要有邮件服务器上合法的用户名和密码之外,还应当关闭安全软件对25端口的监控。关于SMTP的更多介绍,可以参阅RFC821。162 2POP3POP3SMTP是与POP(Post Office Protocol,邮局协议)联合使用的。POP用于接收电子邮件,适用于C/S结构的脱机模型的电子邮件协议,目前已发展到第三版,称为POP3。POP3工作时,当客户机与服务器连接并查询新电子邮件时,被该客户机指定的所有将被下载的邮件都将被程

    9、序下载到客户机,下载后,电子邮件客户机就可以删除或修改任意邮件,而无需与电子邮件服务器进一步交互。POP3在TCP/110端口上等待客户连接请求。POP3客户向POP3服务器发送命令并等待响应,POP3命令采用命令行形式,用ASCII码表示。17服务器响应由一个单独的命令行或多个命令行组成,响应的第一行以ASCII文本“+OK”或“-ERR”指出相应的操作状态是成功还是失败。在POP3协议中有三种状态,即认可、处理和更新状态。当客户机与服务器建立联系时,一旦客户机提供了自己身份并成功确认,即由认可状态转入处理状态,在完成相应的操作后客户机发出quit命令,则进入更新状态,更新之后最后重返认可状

    10、态。SMTP和POP3配合工作的过程如图12-2所示。18图12-2 TCP/IP互联网上电子邮件的传输过程1912.1.2 Base6412.1.2 Base64编码编码E-mail只能传送ASCII码格式的文字信息,而ASCII码是7位代码,非ASCII码格式的文件在传送过程中就需要先编成7位的ASCII代码,然后才能通过E-mail进行传送;如果不经过编码,则在传送过程中会因为ASCII码7位的限制而被分解,分解之后收信方将无法正确解释ASCII字符,从而导致邮件传输失败。在互联网上,由于产生时间、生产厂家和使用协议的不同,对传输数据的编码各不相同,最主要的编码方式有UU编码20(Uni

    11、x-to-Unix encoding)、MIME标准(Multipurpose Internet Mail Extensions)等UU编码解决了E-mail只能传送ASCII文件的问题,但这种方式其实并不是很方便,因而,在Internet上使用一种新的编码标准MIME(Multipurpose Internet Mail Extensions),一般译为“多媒体邮件传送模式”。顾名思义,它可以传送多媒体文件,在一封电子邮件中附加各种格式文件一起送出。MIME定义了两种编码方式:QP(Quote-Printable)与Base64。QP的规则是:不对文件中的数据进行特殊编码,仅将8位的数据转成

    12、7位。21QP编码适用于非ASCII码的文字内容,例如中文字符文件。而Base64的编码规则是将整个文件重新编码成小于或等于7位的数据,通常用于传送二进制文件。编码的方式不同会影响编码之后的文件大小。具有MIME功能的E-mail软件大都能自动判别邮件采用何种编码,然后自动选择用QP或Base64来解码。QP编码是将一个字节用两个十六进制数值表示,然后在前面加“=”。如一段QP编码后的数据为22=A4=AE=A6=A1=A7=DA=AC=B1=E7=A9=A7=A1=AB=DC=B0=AA=BBase64编码后的文字通常为PGquYaZuoUmn2qxPseepc6dnoUGr3LCqv70m

    13、s773t3ymYqa5plakaq5hptu通过上述方法,邮件就可以传输二进制数了,包括声音、图像、文本及可执行文件。收信人通过支持MIME的软件,把编码后的文件翻译过来,读者在了解Base64的原理后,可以很容易地编程实现。2312.1.3 SMTP客户端设计在了解了SMTP的工作原理后,本节进行一个简单的SMTP客户端程序的实现。本程序固化了SMTP的会话过程,假设邮件由发往,并带有一个用户设定路径的文件为附件。编码采用Base64编码方式。#include#include#include const int BASE64_MAXLINE=76;24const char EOL=rn;c

    14、onst char BASE64_TAB=ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz0123456789+/;const char HEADER=HELO rn /AUTH LOGINrn/+BASE64 USER+BASE64 PASS25 MAIL FROM:rn RCPT TO:rn DATArn FROM:rn TO:rn SUBJECT:this is a testrn26 有些SMTP服务器在进行身份认证时,要求对用户名和密码进行基于Base64的编码处理,在进行测试时可利用诸如http:/ X-Mailer:shad

    15、owstars mailerrn MIME-Version:1.0rn Content-type:multipart/mixed;boundary=#BOUNDARY#rn27 /Content-Type:text/plain;charset=gb2312rn rn;const char CONTENT=rn-#BOUNDARY#rn Content-Type:text/plain;charset=gb2312rn Content-Transfer-Encoding:quoted-printablern rn /*28 *Use SMTP to send an eMail with an At

    16、tachment and verify */rn rn;const char ATT_HEADER=rn-#BOUNDARY#rn29 Content-Type:application/octet-stream;name=smtp.exern Content-Disposition:attachment;filename=smtp.exern Content-Transfer-Encoding:base64rn rn;int ANSIToBase64(const char*szInANSI,int nInLen,char*szOutBase64,int nOutLen);略int main(i

    17、nt argc,char*argv)30 WSADATA wsaData;int SockFD;struct sockaddr_in ServAddr;char buf0 x100;int x;FILE *fp;char *aatt=new char0 x400000;char *batt=new char0 x555556;31 /套接字初始化 WSAStartup(MAKEWORD(2,2),&wsaData);LPHOSTENT pHost=gethostbyname();SockFD=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);ServAddr.si

    18、n_family=AF_INET;ServAddr.sin_addr.s_addr=*(ULONG*)pHost-h_addr_list0;32 ServAddr.sin_port=htons(25);/连接邮件服务器并发送邮件头和内容 connect(SockFD,(struct sockaddr*)&ServAddr,sizeof(ServAddr);send(SockFD,HEADER,strlen(HEADER),0);/send HEADER send(SockFD,CONTENT,strlen(CONTENT),0);/send CONTENT 33 send(SockFD,ATT

    19、_HEADER,strlen(ATT_HEADER),0);/send ATT_HEADER /打开本地文件作为邮件附件 fp=fopen(argv0,rb);/read attachment fseek(fp,0,2);x=ftell(fp);if(x 0 x400000)x=0;rewind(fp);fread(aatt,x,1,fp);34 fclose(fp);x=ANSIToBase64(aatt,x,batt,0 x555556);/发送邮件附件 send(SockFD,batt,x,0);/send base64 attachment send(SockFD,.rn,strlen

    20、(.rn),0);/end send(SockFD,QUITrn,strlen(QUITrn),0);/quit /关闭套接字 closesocket(SockFD);35 WSACleanup();delete aatt;delete batt;return 0;本程序实现了基本的SMTP操作(程序中归纳为五步),与实际的邮件服务客户端在功能、界面等方面还相差甚远,但基本反映了邮件客户端的基本骨架。直接使用POP3设计程序的用户较少,编程方法与上述程序类似,这里就不做过多介绍。36互联网之所以能够发展成为万维网,是因为它提供了一种更加方便的信息浏览方式,这就是Web。Web技术基于TCP/I

    21、P协议中的HTTP,更加注重信息的描述本身,而封装了与繁琐的TCP进程相关的维护。12.2 HTTP编程编程3712.2.1 HTTP12.2.1 HTTP简介简介HTTP(Hyper Text Transfer Protocol)即超文本传输协议,是一种用于从Web服务器端传送超文本标记语言文件到客户端浏览器的传输协议,它是Internet上常见的协议之一。我们通常访问的网页,就是通过HTTP协议进行传送的。HTTP用名字标识某一资源时(即在浏览器中输入网址),遵循统一资源名(Uniform Resource Name,URN)的规则,当前网络中最常用的URN是统一资源定位符(Uniform

    22、 Resource Locator,URI),当客户端在浏览器中输入一个URL或单击一个URL超链接时,就确定了要访问的地址。以http:/ HTTP会话过程40(1)客户机与WWW服务器或代理服务器建立连接(TCP)。(2)客户机发送一个请求给WWW服务器或代理服务器,请求的格式为:请求命令符+URL+协议版本号+MIME信息(含请求修饰符、客户机信息和其他可能的内容)。(3)WWW服务器或代理服务器接到请求后,给予响应信息,其格式为:状态行+响应码+MIME信息(含服务器信息、实体信息和其他可能的内容)。41(4)客户端接收WWW服务器或代理服务器返回的信息,并通过浏览器显示在用户的屏幕上

    23、。Http协议的请求命令如表12-4所示。所有命令必须全为大写,否则服务器会认为是不可识别的。42表12-4 Http协议请求命令43对于上述请求命令,服务器会根据具体情况返回响应码,这与12.1.1节介绍的SMTP协议非常类似,响应码的含义如表12-5所示。44表12-5 HTTP请求响应码4512.2.2 WinInet API12.2.2 WinInet APIWinInet是一个网络编程接口,包含了对Internet底层协议HTTP、FTP、Gopher(已不太使用)的访问。借助WinInet接口,不必了解WinSock、TCP/IP和特定Internet协议的细节就可以编写出高水平的

    24、Internet客户端程序。WinInet为HTTP、FTP、Gopher提供了统一的函数集,也就是Win32 API接口,从而简化了这几种协议的编程。461 1Hinternet Hinternet 句柄句柄进行WinInet API客户端程序设计时需要使用一个特殊类型的句柄,即Hinternet。Hinternet不同于常规的Win32句柄,为WinInet所特有。Hinternet句柄由WinInet API函数创建,并且不同的函数所创建的Hinternet句柄之间还存在着承接关系,必须遵循这种承接关系进行嵌套引用。最高级别的Hinternet句柄由InternetOpen()函数创建,

    25、下一级别的Hinternet句柄创建函数(包括InternetOpenUrl()和InternetConnect()必须引用这个句柄来创建,依次类推,图12-4说明了Hinternet句柄的承接关系。47图12-4 Hinternet句柄的承接关系48基于WinInet API的HTTP、FTP的编程步骤是:首先,通过InternetOpen()函数创建位于根部的Hinternet句柄,通过其进一步建立Http、FTP的连接;然后,使用InternetConnect()函数创建一个指定的连接,该连接将通过传递给它的参数为指定的站点初始化HTTP、FTP连接并创建一个从根句柄分支出去的Hiner

    26、net句柄;接着,HttpOpenRequest()和FtpOpenFile()、FtpFindFirstFile()等函数将使用InternetConnect()所创建的句柄以建立到指定站点的连接来进行数据的交互;最后,关闭Hinternet句柄,释放资源。492 2HTTPHTTP函数函数一个基于WinInet API的HTTP的完整编程需要用到以下函数。1)WinInet初始化函数HINTERNET InternetOpen(IN LPCSTR lpszAgent,/应用程序名,可以自定义 IN DWORD dwAccessType,/存取类型IN LPCSTR lpszProxyNam

    27、e,/CERN代理服务器地址50IN LPCSTR lpszProxyBypass,/代理服务器地址IN DWORD dwFlags);/标记,一般设置为0其中,参数dwAccessType可以是INTERNET_OPEN_TYPE_PRECONFIG,表示使用IE中的连接设置;也可以是INTERNET_OPEN_TYPE_DIRECT,表示直接连接到服务器;或者是INTERNET_OPEN_TYPE_PROXY,表示通过代理服务器进行连接。参数dwFlags可以是INTERNET_FLAG_DONT_CACHE,表示不在缓存中保存取得的内容;或是INTERNET_FLAG_OFFLINE,表

    28、示脱机方式。512)打开Url来读取数据函数HINTERNET InternetOpenUrl(IN HINTERNET hInternetSession,/由InternetOpen返回的句柄IN LPCSTR lpszUrl,/文件的Url地址IN LPCSTR lpszHeaders,/发送到服务器的数据头IN DWORD dwHeadersLength,/发送到服务器的数据头长度IN DWORD dwFlags,/标记IN DWORD dwContext);/上下文标记 52其中,参数dwFlags可以是INTERNET_FLAG_RELOAD,表示强制重读数据;或是INTERNET_

    29、FLAG_DONT_CACHE,表示不保存到缓存;或是INTERNET_FLAG_TRANSFER_ASCII,表示使用文本数据;或是INTERNET_FLAG_TRANSFER_BINARY,表示使用二进制数据。533)建立Internet的连接函数HINTERNET InternetConnect(IN HINTERNET hInternetSession,/由InternetOpen返回的句柄IN LPCSTR lpszServerName,/服务器的地址HTTP地址IN INTERNET_PORT nServerPort,/HTTP协议端口号(缺省80)IN LPCSTR lpszUs

    30、ername,/用户名IN LPCSTR lpszPassword,/用户密码IN DWORD dwService,/决定服务类型54IN DWORD dwFlags,/标识IN DWORD dwContext);/上下文其中,参数dwService 可以是INTERNET_SERVICE_FTP,表示连接到一个FTP服务器;也可以是INTERNET_SERVICE_HTTP,表示连接到一个HTTP服务器。554)打开一个HTTP请求的句柄函数HINTERNET HttpOpenRequest(IN HINTERNET hHttpSession,/InternetConnect句柄IN LPC

    31、STR lpszVerb,/命令字IN LPCSTR lpszObjectName,/命令对象IN LPCSTR lpszVersion,/HTTP版本,缺省为“HTTP/1.0”IN LPCSTR lpszReferer,/一个网址,可以为空IN LPCSTR FAR*lpszAcceptTypes,/程序接收的文件类型列表56IN DWORD dwFlags,/标识 IN DWORD dwContext);/上下文其中,参数dwFlags可以使用or连接多个标志,包括INTERNET_FLAG_NO_CACHE_WRITE,表示不缓冲写;INTERNET_FLAG_KEEP_CONNECT

    32、ION,表示保持连接;INTERNET_FLAG_SECURE,表示使用PCT/SSL。575)向HTTP服务器发送指定的请求函数BOOL HttpSendRequest(IN HINTERNET hHttpRequest,/HttpOpenRequest句柄IN LPCSTR lpszHeaders,/服务请求的数据头IN DWORD dwHeadersLength,/服务请求的数据头的长度IN LPVOID lpOptional,/标题后任意数据的地址,用于58 /POST 和 PUT 操作DWORD dwOptionalLength);/数据的长度6)设置一个Internet 选项函数B

    33、OOL InternetSetOption(IN HINTERNET hInternet,/句柄 IN DWORD dwOption,/Internet选项 INTERNET_OPTION_SEND_TIMEOUT/发送请求和连接时的59/超时时间 INTERNET_OPTION_RECEIVE_TIMEOUT,/接收请求和连接时的/超时时间 IN LPVOID lpBuffer,/缓存区 IN DWORD dwBufferLength);/缓存区大小60其中,参数dwOption 可以是INTERNET_OPTION_SEND_TIMEOUT,表示发送请求和连接时的超时时间;或者是INTER

    34、NET_OPTION_RECEIVE_TIMEOUT,表示接收请求和连接时的超时时间。关于其他更多的WinInet API函数这里不作过多的介绍,可以参考MSDN。6112.2.3 HTTP12.2.3 HTTP客户端设计客户端设计本节介绍一个基于WinInet API函数的HTTP客户端程序设计。该程序按照典型的HTTP客户端程序的处理流程设计,简化操作流程可分为七个步骤:调用InternetOpen建立一个HINTERNET会话句柄;调用InternetConnect建立与HTTP服务器的连接;调用HttpOpenRequest初始化下载网页的请求;调用HttpSendRequert发送一

    35、个HTTP请示;62 调用HttpQueryInfo获取HTTP请求信息;调用InternetReadFile读文件;依次调用InternetCloseHandle结束HTTP会话。以下就是该wininethttp2.cpp文件的程序代码。#include stdafx.h#include urlmon.h#include wininet.h#pragma comment(lib,wininet.lib)63#pragma comment(lib,urlmon.lib)typedef HRESULT STDAPICALLTYPE SHOWHTMLDIALOGFN(HWND hwndParent

    36、,IMoniker*pmk,VARIANT*pvarArgIn,TCHAR*pchOptions,VARIANT*pvArgOut);char*buffer;FILE*fp;BOOL ShowHtml()64 SHOWHTMLDIALOGFN*pfnShowHTMLDialog;HINSTANCE hinstMSHTML=LoadLibrary(TEXT(MSHTML.DLL);/装载动态链接库 pfnShowHTMLDialog=(SHOWHTMLDIALOGFN*)GetProcAddress(hinstMSHTML,TEXT(ShowHTMLDialog);65 if(pfnShowHT

    37、MLDialog=NULL)return FALSE;WCHAR*url=Lc:tempweb.html;/此文件名可直接用地址名称代替 if(hinstMSHTML)/装载动态链接库成功 SHOWHTMLDIALOGFN*pfnShowHTMLDialog;pfnShowHTMLDialog=66(SHOWHTMLDIALOGFN*)GetProcAddress(hinstMSHTML,TEXT(ShowHTMLDialog);if(pfnShowHTMLDialog)/根据URL得到IMoniker*变量,需使用urlmon.libIMoniker*moniker=NULL;if(FAIL

    38、ED(CreateURLMoniker(NULL,(LPWSTR)url,&moniker)67 FreeLibrary(hinstMSHTML);return FALSE;char*pOptions=(char*)LdialogHeight:768px;dialogWidth:1024px;help:yes;status:yes;scroll:yes;/这里必须是UNICODE型的字符串,否则更改不了窗口的大小68pfnShowHTMLDialog(NULL,moniker,NULL,pOptions,NULL);/调用ShowHTMLDialog函数显示临时文件中的网页if(moniker

    39、!=NULL)moniker-Release();return TRUE;/显示成功,返回TRUE else return FALSE;/GetProcessAddress失败69FreeLibrary(hinstMSHTML);else return FALSE;/装载动态链接库失败 BOOL openwebpage()/建立会话70 HINTERNET hSession=:InternetOpen(MYHTTPclient,PRE_CONFIG_INTERNET_ACCESS,NULL,INTERNET_INVALID_PORT_NUMBER,0);/建立连接 HINTERNET hCon

    40、nect=:InternetConnect(hSession,/服务器名,记住不要加http:/71 INTERNET_INVALID_PORT_NUMBER,INTERNET_SERVICE_HTTP,0,0);/初始化下载请求 HINTERNET hHttpFile=:HttpOpenRequest(hConnect,GET,/填写欲打开的网页名 HTTP_VERSION,NULL,0,INTERNET_FLAG_DONT_CACHE,0);72 /发送下载请求 BOOL bSendRequest=:HttpSendRequest(hHttpFile,NULL,0,0,0);/获取文件长度

    41、 char bufQuery32;DWORD dwLengthBufQuery=sizeof(bufQuery);BOOL bQuery=:HttpQueryInfo(hHttpFile,HTTP_QUERY_CONTENT_LENGTH,73 bufQuery,&dwLengthBufQuery,NULL);/转换文件的下载页面长度从ASCII字符串到DWORD.DWORD dwFileSize=(DWORD)atol(bufQuery);/为文件分配长度 buffer=new chardwFileSize+1;/读取文件到内存 DWORD dwBytesRead;BOOL bRead=:I

    42、nternetReadFile(hHttpFile,buffer,dwFileSize+1,&dwBytesRead);74 /内存末尾加入0字符 bufferdwBytesRead=0;/将下载的网页写入临时文件 fp=fopen(c:tempweb.html,wt+);int num=fwrite(buffer,sizeof(char),dwFileSize+1,fp);fclose(fp);/关闭所有Internet句柄 :InternetCloseHandle(hHttpFile);:InternetCloseHandle(hConnect);:InternetCloseHandle(

    43、hSession);return TRUE;75int main(int argc,char*argv)openwebpage();/打开并下载网页 ShowHtml();/启动显示html的对话框 return 0;76上述程序将目标网页下载到本地,调用了一个网页显示对话框将下载的文件用分辨率为1024768的、带滚动条的窗口显示出来,显示工作是由ShowHtml实现的。可以说,这个程序就是一个简单的浏览器。如果在此程序上添加自动URL定位分析、多线程爬虫(又称网页蜘蛛,即spider)、网页字符分析、倒排序表建立、检索反馈等模块,就又变成了网络搜索引擎。由于WinInet API短小精悍、

    44、效率高,因此目前在Wince平台下应用的也很多,主要用于手机浏览器等应用的设计。77基于文件传输服务就是让用户连接上一个远程计算机,并查看远程计算机有哪些文件,然后把文件从远程计算机上复制到本地计算机,或把本地计算机的文件传送给远程计算机。这种服务为网络用户的文件共享提供了极大的方便。在TCP/IP协议中,完成该服务的协议主要是FTP协议。12.3 FTP编程编程7812.3.1 FTP简介FTP(File Transfer Protocol,文件传输协议)是Internet上用来传送文件的协议,在Internet上通过FTP服务器可以进行文件的上传(Upload)或下载(Download)。

    45、与前面介绍的SMTP和POP3类似,FTP也是一个请求/响应协议,并且是实时联机服务,在使用它之前必须具有该服务的一个用户(用户名和口令)。工作时,客户端必须先登录到作为服务器一方的计算机上,用户登录后可以进行文件搜索和文件传送等有关操作。使用FTP可以传送所有类型的文件,如文本文件、二进制可执行文件、图像文件、声音文件及数据压缩文件等。79与SMTP、POP3类似,FTP的主要操作都是基于各种命令基础之上的。常用的命令分为登录、退出登录、传输参数、文件操作命令、获得信息命令、其他命令等,表12-6给出了FTP协议主要命令,服务器应答码代表的含义可以在表12-7中查询到。80表12-6 FTP

    46、命令81表12-7 FTP服务器应答码含义8283相比于SMTP和HTTP,FTP协议要复杂得多。复杂的原因是FTP协议要用到两个TCP连接:一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。对于这两条链路,FTP协议有两种工作方式:PORT方式和PASV方式,即主动式和被动式。PORT(主动)式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接并建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了端口,你过来连接我”。于是服务器从20端口向客户端的端口发送连接请求,84建立一条数

    47、据链路来传送数据。PASV(被动)式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了端口,你过来连接我”。于是客户端向服务器的端口发送连接请求,建立一条数据链路来传送数据。概括而言,主动模式是客户端向服务器敲门,然后客户端开门;被动模式是客户端向服务器敲门,然后服务器开门。基于FTP命令和应答码的客户端与服务器交互过程如图12-5所示。85对于FTP的更多介绍,可以参阅RFC959等更多文献,为了突出网络编程多线程设计,下面的编程实习将对FTP连接过程进行简化,并只采用

    48、一个TCP连接传送命令与数据。8612.3.2 WinInet 类为了能够在较高层次建立Internet客户应用程序,使编程过程得到进一步简化,MFC对WinInet API函数进行了封装,从而使程序员从那些复杂的端口和协议细节中解脱出来。WinInet类继承了WinInet API的FTP、HTTP、Gopher的功能,提供了13个对这三种服务进行访问的类:CInternetSession、CInternetConnection、CFtpConnection、CGopherConnection、CHttpConnection、CInternetFile、CGopherFile、CHttpFi

    49、le、CFileFind、CFtpFileFind、CGopherFileFind、CGopherLocator、CInternetException,在afxinet.h文件中声明。87这里着重介绍基于WinInet类进行FTP客户端编程时所需要使用的四个类:CInternetSession、CFtpConnection、CInternetFile、CInternetException。1CInternetSession类CInternetSession类负责创建并初始化一个或几个同步Internet会话,如其成员函数GetFtpConnection()就可以创建一个CFtpConnection对象,实现打开与FTP服务的一个连接。如果需要还可以向代理服务器描述连接。88图12-6 CInternetSession类的派生结构89CInternetSession类提供的QueryOption()、SetOption()、OpenURL()、GetFtpConnection()、GetHttpConnection()、GetGopherConnection()、EnableStatusCallback()、EnableStatusCallback()、ServiceTypeFromHandle()等成员函数,用于完成对连接属性的查询、设置等操作。另外,还提供成员函数GetCont

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:通信网络程序设计章-课件12.ppt
    链接地址:https://www.163wenku.com/p-7267307.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库