《计算机网络课程设计报告--基于UDP协议的聊天程序.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告--基于UDP协议的聊天程序.docx(13页珍藏版)》请在第一文库网上搜索。
1、计算机网络课程设计报告题目:基于UDP协议的聊天程序一、问题描述本课程设计是是基于UDP协议的网络聊天程序设计,UDP协议是无连接的协议,是TCP/IP协议的一种分层协议。通过本设计进一步掌握利用ViSUa1C+进行程序设计的能力和运用面向对象程序设计的思想和方法,初步掌握开发一个小型实用系统的基本方法,理解Windows程序的运行过程。本设计实现的聊天工具要求在MicrosoftVisua1C+6.0,编写一个程序,采用C/S模式,模拟网络上的聊天软件,实现在局域网上两台主机之间的通信。且经过测试,该聊天程序能够正常运行,实现了设计目标。二、概要设计2. 1设计原理UDP协议的全称是用户数据
2、报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OS1模型中,在第四层一一传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。UDP是定义用来在互连网络环境中提供数据报交换的计算机通信的协议。此协
3、议默认是IP下层协议。此协议提供了向另一用户程序发送信息的最简便的协议机制,不需要连接确认和保护复制,所以在软件实现上比较简单,需要的内存空间比起TCP相对较小。UDP包头由4个域组成,其中每个域各占用2个字节。(1)源端口号(16位):UDP数据包的发送方使用的端口号。(2)目标端口号(16位):UDP数据包的接收方使用的端口号。UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和rap协议正是采用这一机制,实现对同一时刻内多项应用同时发送和接收数据的支持。(3)数据报长度(16位)。数据报的长度是指包括报头和数据部分在内的总的字节数。理论上,包含报头在内的数据包的最大长度为6
4、5535字节。不过,一些实际应用往往会限制数据包的大小,有时会降低到8192字节。(4)校验值(16位)。UDP协议使用包头中的校验值来保证数据的安全。2.2客户机/服务器模式由于这次课程设计是实现点到点的可靠连接,所以在此使用UDP连接方式。在这个连接中,双方分为客户和服务器,他们各自的功能不同。客户机一方,UDP应用程序功能如下:(1)打开通信信道(申请一套接字),并连接到服务器在主机的保留端口,该端口对应服务器的UDP进程。(2)向服务器发出请求报文,等待接收应答。(3)从服务器方收到最终应答结果,或在不再请求时关闭信道并终止客户机进程。服务器一方,UDP应用程序动作如下:(1)打开通信
5、信道(申请一套接字),通知本地主机在某一保留端口接收客户机请求。(2)等待客户请求到达指定端口。(3)接收到请求,启动一新进程处理用户请求,同时释放旧进程以响应新的客户请求,一旦服务完成,关闭新进程与客户的通信。(4)继续等待客户机请求。(5)如果不想响应客户机请求,关闭服务器进程2.2系统流程图三、详细设计3. 1设计思路基于UDP协议通信和基于TCP协议的通信不同,基于UDP的消息传递更快,但不提供可靠性的保证。也就是说,数据在传递的时候,用户无法知道数据能否正确的到达目的地主机,也不能确定数据到达目的地的顺寻是否和发送的顺序相同。系统采用的是客户端/服务器工作模式,所以应有客户端和服务器
6、两个类,其中客户端向服务器请求服务。而基于UDP通信的基本模式是:将数据打包,称为数据包,然后将数据包发往目的地。接受别人发来的数据包,然后查看数据包的内容。3. 2基于UDP的聊天程序服务器端源程序:创建套接字,因为是基于UDP的,所以用SOCK_DGRAM.SOCKETSockSrv=SOCket(AF_INET,SOCK_DGRAM,O);对于服务器端,接着应该进行绑定SOCKADDR_INaddrSrv;定义一个地址结构体的变量addrSrv.sin_addr.Sun.Saddr=hton1(INADDRANY);addrSrv.Sin_fami1y二AFNET;地址族addrSrv.
7、Sin_POrt=htons(6000);端口号bind(sockSrv,(SOCKADDR*)feaddrSrv,Sizeof(SOCKADDR);charrecvBuf100;字符数组,用来接收信息charSendBUf100;用来发送信息chartempBuf200;用来存放中间数据SOCKADDR_INaddrC1ient;定义一个地址结构体的变量,在通讯的时候,我们需要获取和我们通讯的这一方的地址信息,这一获取是我们通过调用recvfrom来获得的,但是我们需要提供一个地址结构体的变量intIen=Sizeof(SOCKADDR);WhiIe循环,保证通讯过程能够不断的循环下去whi
8、1e(1)(接收数据recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)feaddrC1ient,&1en);判断是否结束对话,q表示结束if(,q,=recvBuf0)Sendto(SoCkSrV,q,Str1en(q)+1,0,(SOCKADDR*)feaddrC1ient,1en);PrintfCCharend!nz,);break;)将数据格式化到tempBuf中sprintf(tempBuf,z%ssay:%s,z,inet_ntoa(addrC1ient.sin_addr),recvBuf);/addrC1ient.sin_addr表示对方的IP地址
9、,inentoa将IP转换为点分十进制表示的形式,如172.0.0.1将输出信息设置成绿色Setconso1eTextAttribute(GetStdHand1e(STD_OUTPUT_HAND1E),FOREGROUND_INTENSITYIFoREGROUND_GREEN);printf(,%sn,tempBuf);将数据打印输出将字体颜色选回默认Setconso1eTextAttribute(GetStdHand1e(STD_OUTPUT_HAND1E),FOREGROUND_INTENSITYIFoREGROUND_REDFOREGROUND_GREENFOREGROUND_B1UE)
10、;printf(,zP1easeinputdata:n,z);Setconso1eTextAttribute(GetStdIIand1e(STD_OUTPUT_HAND1E),FOREGROUND_INTENSITYIFOREGROUND_GREEN);gets(sendBuf);从键盘输入数据sendto(sockSrv,sendBuf,str1en(sendBuf)+1,0,(SOCKADDR*)feaddrC1ient,1en);/发送数据)当循环结束的时候,关闭套接字c1osesocket(sockSrv);终止对套接字的使用WSAC1eanupO;3. 3基于UDP的聊天程序客户端端
11、源程序:创建套接字SOCKETSockC1ient=Socket(AF_INET,SoCK_DGRAM,0);基于UDP的客户端来说,它不需要去绑定,但是要设置信息将要发送到对方机器的地址信息,也就是服务器端的地址信息SOCKADDR_INaddrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr(,7127.O.O.1);addrSrv.Sin_fami1y=AF_INET;地址族addrSrv.sinport=htons(6000);接收端口号charrecvBuf100;接收数据charSendBUf100;发送数据chartempBuf200;临时数据
12、存储intIen=Sizeof(SOCKADDR);用于返回接收数据的地址结构的长度,必须先经过初始化whi1e(1)(printf(,p1easeinputdata:n,z);Setconso1eTextAttribute(GetStdIIand1e(STD_OUTPUT_HAND1E),FOREGROUND_INTENSITYIFOREGROUND_REDFOREGROUND_GREEN);gets(sendBuf);sendto(sockC1ient,sendBuf,Str1en(sendBuf)+1,0,(SOCKADDR*)&addrSrv,Ien);发送数据recvfrom(soc
13、kC1ient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&1en);接收数据判断是否结束对话if(,q,=recvBuf0)(sendto(sockC1ient,zqz,Str1en(q)+1,0,(SOCKADDR*)&addrSrv,1en);printf(,zChatend!n);break;)将接收到的数据格式化到tempBuf中sprintf(tempBuf,z%ssay:%s,z,inet_ntoa(addrSrv.sin_addr),recvBuf);将字体设置为黄色Setconso1eTextAttribute(GetStdIIand1e(STD_O
14、UTPUT_HAND1E),FOREGROUND_INTENSITYIFOREGROUND_REDFOREGROUND_GREEN);printf(,z%s,z,tempBuf);将字体选回默认Setconso1eTextAttribute(GetStdHand1e(STD_OUTPUT_HAND1E),FOREGROUND_INTENSITYIFOREGROUND_REDFOREGROUND_GREENFOREGROUND_B1UE);)关闭套接字c1osesocket(sockC1ient);终止对套接字库的使用WSAC1eanup();)四、调试分析4. 1测试中遇到的问题(1)刚开始不
15、知道必须先运行客户端程序,一直出错,后来经过反复思考以及调试才得以改正;(2)4. 2测试结果打开客户端打开服务器r田同EC:UsersAdministratorDesktopNetSrvNetC1ientDebugNetC1ientexep1easeinputdata:he11oo113C:UsersAdministratorDesktopNetSrvDebugNetSrv.ee127.0.0.1say:heI1oP1easeinputdata:服务器收到消息M3C:UsersAdministratorDesktopNetSrvDebugNetSrv.exea27.0.0.1say:he11oP1easeinputdata:3C:UsersAdministratoOesktopNetSrvNetC1ientDebugNetC1ient.exep1easeinputd