通信网络程序设计章-课件12.ppt
- 【下载声明】
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()函数创建,
展开阅读全文