《基于UDP协议的网络聊天程序设计.docx》由会员分享,可在线阅读,更多相关《基于UDP协议的网络聊天程序设计.docx(9页珍藏版)》请在课桌文档上搜索。
1、基于UDP协议的网络聊天程序设计学生姓名:XX指导老师:XX摘要本课程设计是是基于UDP协议的网络聊天程序设计,UDP协议是无连接的协议,是TCP/IP协议的一种分层协议。通过本设计进一步掌握利用ViSUalC+进行程序设计的能力和运用面向对象程序设计的思想和方法,初步掌握开发一个小型实用系统的根本方法,理解Windows程序的运行过程。本设计实现的聊天工具要求在MicrosoftVisualC+6.0上,编写一个程序,采用C/S模式,模拟网络上的聊天软件,实现在局域网上两台主机之间的通信。且经过测试,该聊天程序能够正常运行,实现了设计目标。关罐词UDP协议;客户机/效劳器;网络聊天1引言现在
2、是网络的世界,网络开展的不可估量了,它可以包括我们生活中的方方面面,小到上网浏览新闻、上网购物,大到网上理财、网上会议,可以说网络把我们的世界变小了,即使在海角天边,只要有网络的地方我们就可以随时联系。最简单的形式就是进行网络聊天了,比方QQ、MSN等等很简单的聊天工具,可以随时拉近你我的距离。本设计将基于UDP协议和局域网环境,实现一个即时聊天程序。1.1 本文主要内容本文第二节介绍了UDP协议和客户机/效劳器模式根本原理,第三节详细描述了设计思路和流程,第四节为本次课程设计的总结。1.2 设计平台MicrosoftVisualC+6.0,简称VC或者VC6.0,是微软推出的一款C+编译器,
3、将“高级语言*翻译为机器语言(低级语言)的程序。VisualC+是一个功能强大的可视化软件开发工具。自1993年MiCroSoft公司推出ViSUaIC+1.0后,随着其新版本的不断问世,VisualC+己成为专业程序员进行软件开发的首选工具。虽然微软公司推出了VisualC+.NET(VisualC+7.0),但它的应用有很大的局限性,只适用于WindoWS2000、WindowsXP和WindoWSNT4.0。所以实际中,更多的是以ViSUalC+6.0为平台。VisualC+6.0由Microsoft开发,它不仅是一个C+编译器,而且是一个基于Windows操作系统的可视化集成开发环境(
4、integrateddevelopmentenvironment,IDE)oVisualC+6.0由许多组件组成,包括编辑器、调试器以及程序向导APPWiZard、类向导CIaSSWiZard等开发工具。这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。Microsoft的主力软件产品。ViSUalC+是一个功能强大的可视化软件开发工具。自1993年MiCrOSoft公司推出ViSUaIC+1.0后,随着其新版本的不断问世,ViSUalC+己成为专业程序员进行软件开发的首选工具。虽然微软公司推出了VisualC+.NET(VisualC+7.0),但它的应用的很大的
5、局限性,只适用于WindoWS2000,WindoWSXP和WindoWSNT4.0。所以实际中,更多的是以VisualC+6.0为平台。2设计原理2.1 UDP协议原理UDP协议的全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSl模型中,在第四层传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否平安完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/效劳器模式的网络应用都需要使用UDP协议。UDP协议从问世至今己经被使
6、用了很多年,虽然其最初的光荣己经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。UDP是OSl参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送效劳。UDP协议根本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个
7、典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节那么用来包含具体的传输数据。UDP是无连接的,即发送数据之前不需要建立连接(当然发送数据结束时也没有连接可释放)因此减少了开销和发送数据之前的时延。UDP使用的是尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。UDP是面向报文的。发送方的UDP对应程序交下来的报文,在添加首部后就向下交付给IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保存这些报文的边界。UDP是定义用来在互连网络环境中提供数据报交换的计算机通信的协议。此协议默认是IP下层协议。此协议提供了向另一用户程
8、序发送信息的最简便的协议机制,不需要连接确认和保护复制,所以在软件实现上比拟简单,需要的内存空间比起TCP相对较小。UDP包头由4个域组成,其中每个域各占用2个字节。(1)源端口号(16位):UDP数据包的发送方使用的端口号。(2)目标端口号(16位):UDP数据包的接收方使用的端口号。UDP协议使用端口号为不同的应用保存其各自的数据传输通道。UDP和rap协议正是采用这一机制,实现对同一时刻内多项应用同时发送和接收数据的支持。(3)数据报长度(16位)。数据报的长度是指包括报头和数据局部在内的总的字节数。理论上,包含报头在内的数据包的最大长度为65535字节。不过,一些实际应用往往会限制数据
9、包的大小,有时会降低到8192字节。(4)校验值(16位)。UDP协议使用包头中的校验值来保证数据的平安。2.2 客户机/效劳器模式由于这次课程设计是实现点到点的可靠连接,所以在此使用UDP连接方式。在这个连接中,双方分为客户和效劳器,他们各自的功能不同。客户机一方,UDP应用程序功能如下:(1)翻开通信信道(申请一套接字),并连接到效劳器在主机的保存端口,该端口对应效劳器的UDP进程。(2)向效劳器发出请求报文,等待接收应答。(3)从效劳器方收到最终应答结果,或在不再请求时关闭信道并终止客户机进程。效劳器一方,UDP应用程序动作如下:(1)翻开通信信道(申请一套接字),通知本地主机在某一保存
10、端口接收客户机请求。(2)等待客户请求到达指定端口。(3)接收到请求,启动一新进程处理用户请求,同时释放旧进程以响应新的客户请求,一旦效劳完成,关闭新进程与客户的通信链路。(4)继续等待客户机请求。(5)如果不想响应客户机请求,关闭效劳器进程。3设计步骤3.1 总体设计思路基于UDP协议通信和基于TCP协议的通信不同,基于UDP的消息传递更快,但不提供可靠性的保证。也就是说,数据在传递的时候,用户无法知道数据能否正确的到达目的地主机,也不能确定数据到达目的地的顺寻是否和发送的顺序相同。系统采用的是客户端/效劳器工作模式,所以应有客户端和效劳器两个类,其中客户端向效劳器请求效劳。而基于UDP通信
11、的根本模式是:将数据打包,称为数据包,然后将数据包发往目的地。接受别人发来的数据包,然后查看数据包的内容。3. 2功能模块调用流程设计:其中,效劳器端:Socket(),建立流式套接字:Bind(),将套接字和效劳器地址结构绑定:ReceiveFromOZSendToO,在套接字上接收/发送数据;Close(),关闭套接字。客户端与效劳器端同理。4. 3基于UDP的网络聊天程序实现3.3.1 基于UDP的聊天程序效劳器端源程序:创立套接字第二个参数和TCP设置不同SOCKETsockSrv=socket(AF_INET,SOCK_DGRAM.0);SockaddrjnaddrSrv;设置效劳器
12、端套接字的地址结构的相关属性addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);设置IPaddrSrv.sin_port=htons(20000);设置端口号addrSrv.sin_family=AF_INET;将套接字和效劳器地址结构绑定bind(sockSrv,(SOCKADDR*)&addrSrv,Sizeof(SOCKADDR);charrecvBufI(X);charsendBufI(X);chartempBuf,100;Sockaddrjnaddrciient;intIen=Sizeof(SOCKADDR);从客户端接收数据recvfrom
13、(sockSrv,recvBuf,I(X),O,(SOCKADDR*)&addrClient,&len);if(,q,=recvBufO)Isendto(sockSrv,q,strlen(,q)+1,0,(SOCKADDR*)&addrClient,len);coutchartendend);break;退出循环将对方发送过来的信息前段加上IP地址进行输出sprintf(tempBuf,%ssay%sn,inet_ntoa(addrClient.sin_addr),recvBuf);couttempBufendl;将用户的键盘输入发送到对方coutnPleaseinputmessage:”en
14、dl;gets(sendBuf);sendto(sockSrv,sendBuf,strlen(sendBuf)1,O,(SOCKADDR*)&addrClient,len);3.3.2 基于UDP的聊天程序客户端端源程序:/创立套接字SOCKETSockClient=socket(AFJNET,SOCK_DGRAM,0);第二个参数和TCP设置不同SOCKADDjlNaddrSrv;效劳器地址结构addrSrv.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);效劳器地址addrSrv.sin_port=htons(20000);效劳器端口号addrSrv.s
15、in_family=AF_INET;cout请输入发送的消息:hendl;gets(sendBu;得到用户的键盘输入将对方发送过来的信息前段加上IP地址进行输出sprintf(tempBuf,%ssay%sn,inet_ntoa(addrSrv.sin_addr),recvBuf);couttempBufendl;3.4程序测试结果图3.2客户端向效劳器发送信息图3.3效劳器收到信息图3.4效劳器向客户端发送信息图3.5客户端收到效劳器信息4结束语这次计算机网络课程设计历时两个星期,让我学到了很多很多的东西。不仅稳固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。当然,在这个过程
16、中我也遇到了很多问题,不过由于老师耐心的帮助和讲解,使我更进一步加深了对计算机网络的了解,让我对它有了更加浓厚的兴趣。特别是当每一步成功时,心里特别的开心。总的来说,这次设计的基于UDP协议的网络聊天程序还是比拟成功的,在设计中遇到了很多问题,最后在老师的辛勤指导下,终于迎刃而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,到达了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!参考文献1谢希仁.计算机网络(第四版)M.北京:电子工业出版社,
17、20032陆魁军等.计算机网络根底实践教程M.北京:清华大学出版社,20053陈坚、陈伟编著.VisualC+网络高级编程.北京:人民邮电出版社,20014吴功宜、胡晓英等编著计算机网络课程设计北京:机械工业出版社,2023.8附件1:首先编写效劳器端程序,实现代码如下:ChatServer#include#include#pragmacomment(lib,Ws2-32.libu)usingnamespacestd;intmain(intargc,CHAR*argv)WORDWVersionRequested;WSADATAwsaData;interr;WVersionRequested=M
18、AKEWORD(2,O);err=WSAStartup(wVersionRequested,&wsaData);if(err!=O)coutnWSAStartupError!,endl;return1;if(LOBYTE(wsaData.wVersion)!=2HIBYTE(wsaData.wVersion)!=O)coutVersionnotrignt!endl;WSACleanupO;return1;创立套接字/第二个参数和TCP设置不同SOCKETsockSrv=socket(AF_INET,SOCK_DGRAM.O);SOCKADDRNaddrSrv;设置效劳器端套接字的地址结构的相关
19、属性addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);设置IPaddrSrv.sin_port=htons(20000);设置端口号addrSrv.sin-family=AF_INET;/将套接字和效劳器地址结构绑定bind(sockSrv,(SOCKADDR*)&addrSrv,Sizeof(SOCKADDR);charrecvBufI(M);charSendButJl(X)I;chartempBufJ1001;Sockaddrjnaddrciient;intIen=Sizeof(SOCKADDR);while(l)/从客户端接收数据recvfro
20、m(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&Ien);if(,q,=recvBufI0)sendto(sockSrv,q,strlen(,q)+1,0,(SOCKADDR*)&addrClient,Ien);couivchartend1end!;break;退出循环将对方发送过来的信息前段加上IP地址进行输出SPrintf(tempBuf,%ssay%sn,inet_ntoa(addrClient.sin_addr),recvBuf);coutIempBufendl;将用户的键盘输入发送到对方cout,Pleaseinputmessage:e
21、ndl;gets(sendBuf);sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len);closesocket(sockSrv);WSACleanupO;return0;)下面编写聊天客户端程序,实现代码如下:Chatclient#include#include#pragmacomment(lib,Ws2_32.1ib)静态参加一个Iib文件usingnamespacestd;intmain(intargc,CHAR*argv)IWORDWVersionRequested;WSADATAwsaData;i
22、nterr;WVersionRequested=MAKEWORD(2,O);err=WSAStartupCWVersionRequested,&wsaData);if(err!=O)coutnWSAStartupError!,endl;return1;)if(LOBYTE(wsaData.wVersion)!=2HIBYTE(wsaData.wVersion)!=O)coutVersionnotrignt!,tendl;WSACleanupO;return1;创立套接字SOCKETSockClient=socket(AFJNET,SOCK_DGRAM,O);注意第二个参数和TCP设置不同Soc
23、kaddrjnaddrSrv;效劳器地址结构addrSrv.sin_addr.S_un.S_addr=inet_addr(l27.0.0.,);/效劳器地址addrSrv.sin_port=htons(20000);效劳器端口号addrSrv.sin_family=AF_INET;charrecvBuflOO;charsendBuf100;chartempBuf100;intIen=Sizeof(SOCKADDR);while(l)COUt请输入发送的消息、:endl;gets(sendBuf);得到用户的键盘输入sendto(sockClient,sendBuf,strlen(sendBuf
24、)I,O,(SOCKADDR*)&addrSrv,Ien);recvfrom(sockClient,recvBuf,100,O,(SOCKADDR*)&addrSrv,&len);if(,q,=recvBuflO)sendto(sockClient,q,strlen(q)+1,0,(SOCKADDR*)&addrSrv,len);coutchartendendl;break;退出循环将对方发送过来的信息前段加上IP地址进行输出sprintf(tempBuf,%ssay%sn,inet_ntoa(addrSrv.sin_addr),recvBuf);couttempBufendl;closesocket(sockClient);WSACleanupO;return0;