CSU通信网原理课程设计.doc_第1页
CSU通信网原理课程设计.doc_第2页
CSU通信网原理课程设计.doc_第3页
CSU通信网原理课程设计.doc_第4页
CSU通信网原理课程设计.doc_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中南大学通信网原理课程设计报告 班 级: 姓 名: 学 号: 指导老师: 实验地点: 完成日期: 电子信息工程系信息科学与工程学院目 录第一部分:课程设计的目的与任务1一、课程设计的目的1二、课程设计的主要任务1第二部分:滑动窗口协议仿真2一、 课程设计目的及要求2二、 设计思想2三、 设计流程图2四、 开发环境4五、 关键代码分析4六、 仿真运行10第三部分:网络即时通讯程序12一、 课程设计目的及要求12二、 设计思想12三、 设计流程图13四、 开发环境14五、 关键代码分析14六、 运行与调试20第四部分:课程设计心得体会23第五部分:参考文献24第六部分:附录24一、 滑动窗口协议仿真24二、 网络即时通讯程序3369 / 73第一部分:课程设计的目的与任务 一、课程设计的目的 通信网原理课程设计是为电子信息工程专业本科生开设的必修课,有2 学分,既是对通信网原理课程实验教学环节的补充,又是一门实践性很强的综合强化训练课程。计算机网络或Internet 网已成为现代最重要的通信网,未来各种通信网都将以计算机网络和IP 协议为核心实现互连互通。因此,本课程设计的主要任务是在掌握计算机网络TCP/IP 等典型协议原理的基础上,通过编程设计对网络协议或算法进行模拟实现,并应用相应网络协议来开发一个网络应用系统。其目的是通过将理论与实践相结合,使学生进一步深入理解通信网的工作原理,掌握网络应用开发技术,学会应用所学理论知识来分析和解决实际问题,培养网络技术研究与开发的基本能力以及创新精神。2、 课程设计的主要任务 通过本课程教学,要求学生熟悉TCP/IP 协议工作机制、熟悉基于Socket 的网络通信程序的设计方法,熟练掌握至少一种编程语言及工具的使用。通过设计和调试有关程序,掌握一种网络协议或算法的编程实现方法或具体应用,同时设计一个相对独立的网络应用程序。第二部分:滑动窗口协议仿真1、 课程设计目的及要求1、 程序按照滑动窗口协议实现端对端的数据传送。包括协议的各种策略,如包丢失、停等应答、超时等都应有所仿真实现。2、 显示数据传送过程中的各项具体数据;双方帧的个数变化,帧序号,发送和接受速度,暂停或重传提示等。3、 增加其它附加创新功能。2、 设计思想滑动窗口协议是TCP使用的一种流量控制方法。本次课程设计模拟仿真1比特滑动窗口协议,即停等协议。该协议规定,发送方每发送一帧后就要停下来,等待收到接收方正确接受的确定后再继续发送下一帧。如果在规定的最大时延内没有收到接收方的确认信号,则重新发送该帧。为了确认每次发送的帧是以前发过的还是新发送的,接收方需要发送方对每一帧加一个编号。由于停等协议规定只有一帧确认发送完成后才可以发送下一帧,因而只用一比特来编号就可以了。3、 设计流程图新数据或重发数据处理时间最大时延确认信号发送数据接收方发送方4、 开发环境Window7,VC+5、 关键代码分析1、 定义及初始化守法窗口typedef struct /*接收窗口*/int rMAXSIZE;int front;int rear;wrece;void Init(wsend *ws,wrece *wr) /*对发送和接收窗口进行初始化*/ws-front=ws-rear=0;wr-front=wr-rear=0;2、 说明发送窗口的发送情况int SEND(wsend *ws,wrece *wr,int frame)if(ws-rear+1)%MAXSIZE=ws-front)return 0; /*发送窗口已满*/if(ws-front=ws-rear) /*若窗口为空,则直接进入*/ws-sws-rear.snum=frame;ws-sws-rear.timeout=1;ws-rear=(ws-rear+1)%MAXSIZE;wr-rwr-rear=frame;wr-rear=(wr-rear+1)%MAXSIZE;return 1;else /*若窗口不为空,则判断是否是可传送的帧*/ if(frame=(ws-sws-rear-1.snum)+1)ws-sws-rear.snum=frame;ws-sws-rear.timeout=1;ws-rear=(ws-rear+1)%MAXSIZE;wr-rwr-rear=frame;wr-rear=(wr-rear+1)%MAXSIZE;return 1;else if(framesws-rear-1.snum)+1)printf(该帧已发送!n);else if(frame(ws-sws-rear-1.snum)+1)printf(该帧不可发送!n);3、 说明接受窗口的接受情形int RECE(wrece *wr,int frame,int ack)if(wr-front=wr-rear) return 0; /*接收窗口为空*/else /*接收窗口接收帧号,并返回确认*/if(wr-rwr-front=frame) wr-front=(wr-front+1)%MAXSIZE;printf(第%d帧出接收窗口,向发送窗口返回确认。n,frame);acki=frame;i+;else printf(该帧不是期望收到的帧,舍弃。n);return 1;int ACKNOWLEDGE(wsend *ws,int ack)int j;if(ws-front=ws-rear) return 0; /*发送窗口为空*/if(ack0=ws-sws-front.snum) /*发送窗口进行确认处理*/ws-front=(ws-front+1)%MAXSIZE;for(j=0;jfront;b=wr-front;printf(发送窗口:);while(arear)printf(%3d ,ws-sa);a+;printf(n);printf(接收窗口:);while(brear)printf(%3d ,wr-rb);b+;printf(n);4、 接受错误要求重新发送main()int frame,a,flag=0; /*frame帧号,a指向窗口当前位置,flag是否有重发(0没有,1有)*/ int err;char end=n,ch,ACK;int ack5; /*定义一个可存储5个确认信息的*/wsend *ws;wrece *wr;ws=(wsend *)malloc(sizeof(wsend);wr=(wrece *)malloc(sizeof(wrece);Init(ws,wr);printf(程序开始运行n);while(end!=y&end!=Y)/*传送处理*/a=ws-front; while(arear)if(ws-sa.timeout=6) ws-sa.timeout=1;flag=1;printf(重发第%d帧n,ws-sa);else ws-sa.timeout+;a+;if(flag=0)printf(请输入需传送的帧号(0代表不输入):);scanf(%d,&frame);if(frame!=0)err=SEND(ws,wr,frame);if(err=0)printf(发送窗口已满!n);printf(接收窗口期待接收到的帧号为:%dn,wr-rwr-front);6、 仿真运行第三部分:网络即时通讯程序1、 课程设计目的及要求1、 用户登录功能:客户端登录到聊天服务器,服务器管理所有登录的客户,并将客户列表及状态发送到各个客户端显示;2、 用户呼叫功能:用户可通过客户端向服务器发起呼叫请求;服务器搜索被呼叫的用户,如果检测到此用户处于在线状态,则通知此用户的客户端程序;当被叫用户做出响应后,在主叫方和被叫方之间建立连接,双方就可以聊天或进行媒体流传输;3、 用户消息也可以通过服务器转发,实现一对一和多对多聊天;4、 增加其它附加创新功能。2、 设计思想实现网络即时通讯的基本思想是由客户端将信息发送到服务器端,然后由服务器端判断将信息发往某个特定的用户还是所有用户。为实现用户登录功能,可以建立一个用户信息的数据库或文件,来实现用户的登录或注册。用户聊天功能的实现需要在用户登录进入聊天室时建立一个链接,该链接由服务器端监控,由此来实现用户在线数量的控制和在线人数的显示。当某一用户发起对另一用户的聊天请求时,由服务器端判断该用户是否在线,规定只能向在线用户发送消息。若该用户在线,则将发送用户发送来的消息通过链接转发到接收用户的客户端上,由客户端显示。如果发送用户发送的消息是对所有人的,则将该消息转发至所有人。其他创新功能包括了禁止某人发言或将某用户踢出聊天室。禁止发言通过对其链接的屏蔽,踢出用户则是由服务端断开其链接,从而达到踢出某用户的目的。3、 设计流程图退出登录踢出禁言服务器客户端建立链接并监听进入聊天室验证登录服务器端客户端4、 开发环境Window7,SQL service2005,Visual Basic5、 关键代码分析1、 服务器设置聊天室最大人数并验证登录Private Sub Command1_Click() MaxChan = Val(Text1.Text)If MaxChan 100 Then Text1.Text = Text1.SetFocusElse frmServer.Show Unload MeEnd If End SubPrivate Sub Form_Load()Dim filepath As String sysfilepath = fso.GetSpecialFolder(1)If fso.FileExists(sysfilepath & Mswinsck.ocx) = True Then Exit SubElse MsgBox (Mswinsck.ocx不存在!准备安装.) If fso.FileExists(Mswinsck.ocx) = True Then Set fil = fso.GetFile(Mswinsck.ocx) fil.Copy (sysfilepath & ) MsgBox (Mswinsck.ock安装成功!) Else MsgBox (当前文件夹找不到Mswinsck.ocx,安装失败!) End IfEnd IfEnd Sub2、 客户端登录并向服务器验证Private Sub Command1_Click() ServerIP = ReadServerIP(Setup.ini) userName = Trim(Text1.Text) If userName = Then MsgBox 姓名不能为空! Text1.SetFocus Exit Sub End If Load frmClient Command1.Enabled = FalseEnd SubPrivate Sub Form_Load() Dim filepath As String sysfilepath = fso.GetSpecialFolder(1)If fso.FileExists(sysfilepath & Mswinsck.ocx) = True Then Exit SubElse MsgBox (Mswinsck.ocx不存在!准备安装.) If fso.FileExists(Mswinsck.ocx) = True Then Set fil = fso.GetFile(Mswinsck.ocx) fil.Copy (sysfilepath & ) MsgBox (Mswinsck.ock安装成功!) Else MsgBox (当前文件夹找不到Mswinsck.ocx,安装失败!) End IfEnd If3、 建立并监听链接Public Function ReadServerIP(filename As String) As String Dim ss As String cs = ss = Open filename For Input As #1 Line Input #1, ss Close #1 ReadServerIP = Mid(ss, 2, Len(ss) - 2)End Function4、 禁言与踢出功能的实现Private Sub Command1_Click() Dim index As Integer Dim S As String Dim recUser As String S = Trim(Text2.Text) Text2.Text = recUser = Combo1.Text If recUser = 所有人 Then If S = SystemOrder:禁言 Then For i = 0 To MaxChan - 1 userState(i) = 2 Next End If Else index = FindSckIndex(recUser) If S = SystemOrder:禁言 Then userState(index) = 2 Call SendToOne(S, index) End If If recUser = 所有人 Then If S = SystemOrder:踢出 Then For i = 0 To MaxChan - 1 userState(i) = 3 Next End If Else index = FindSckIndex(recUser) If S = SystemOrder:踢出 Then userState(index) = 3 Call SendToOne(S, index) End If S = 对 & recUser & 说: & S Call AddToText1(S) End Sub If s = SystemOrder:踢出 Then sckClient.Close MsgBox 很抱歉,你被管理员踢出! Unload Me Exit Sub End If If s = SystemOrder:禁言 Then n = 1 MsgBox 很抱歉,你被管理员禁言! Unload Me Exit Sub End If5、 私聊与公聊的实现 Private Sub cmdSend_Click() Dim recUser As String If n 1 Then recUser = Combo1.Text If Combo1.Text 所有人 Then recUser = If Check1.Value = 0 Or Combo1.Text = 所有人 Then sckClient.SendData & 对 & recUser & 说: & txtSend.Text DoEvents Else sckClient.SendData Combo1.Text & 038868SendToOne & & 悄悄对 & recUser & 说: & txtSend.Text DoEvents End If txtSend.Text = ElseEnd sub6、 运行与调试第四部分:课程设计心得体会通过此次课程设计,实践巩固了通信网原理课程中学到的知识,并在实践中练习了TCP/IP协议的使用。在滑动窗口协议的仿真中,由于能力不足,只能简单的做了一比特滑动窗口协议即停等协议的仿真,而且没有做到可视化界面,总体来说不尽人意。网络即时通讯程序的编写绝大部分由自己完成,仅在网上和书上参考查找了部分内容。此次课程设计不光是通信网原理课程的延伸,也是对以后网络基础的铺垫。还有通过自己动手编写程序,锻炼了我的编程能力。第五部分:参考文献(1) 吴功宜、吴英编著.计算机网络技术教程自顶向下的分析与设计方法.北京:机械工业出版社,2010(2) 谢希仁.计算机网络(第4版).北京:电子工业出版社.(3) 刘韬,骆娟Visual Basic 数据库通用模块及电信系统开发。机械工业出版社第六部分:附录1、 滑动窗口协议仿真#include stdio.h#include malloc.h#define MAXSIZE 10 /*窗口大小,即队列大小*/int i=0; /*全局变量,代表当前指向确认表的位置*/typedef struct /*发送窗口每帧的数据*/int snum; int timeout;/*非0时代表发送计时,=6时表明超时*/send;typedef struct /*发送窗口*/send sMAXSIZE;int front;int rear;wsend;typedef struct /*接收窗口*/int rMAXSIZE;int front;int rear;wrece;void Init(wsend *ws,wrece *wr) /*对发送和接收窗口进行初始化*/ws-front=ws-rear=0;wr-front=wr-rear=0;int SEND(wsend *ws,wrece *wr,int frame)if(ws-rear+1)%MAXSIZE=ws-front)return 0; /*发送窗口已满*/if(ws-front=ws-rear) /*若窗口为空,则直接进入*/ws-sws-rear.snum=frame;ws-sws-rear.timeout=1;ws-rear=(ws-rear+1)%MAXSIZE;wr-rwr-rear=frame;wr-rear=(wr-rear+1)%MAXSIZE;return 1;else /*若窗口不为空,则判断是否是可传送的帧*/ if(frame=(ws-sws-rear-1.snum)+1)ws-sws-rear.snum=frame;ws-sws-rear.timeout=1;ws-rear=(ws-rear+1)%MAXSIZE;wr-rwr-rear=frame;wr-rear=(wr-rear+1)%MAXSIZE;return 1;else if(framesws-rear-1.snum)+1)printf(该帧已发送!n);else if(frame(ws-sws-rear-1.snum)+1)printf(该帧不可发送!n);int RECE(wrece *wr,int frame,int ack)if(wr-front=wr-rear) return 0; /*接收窗口为空*/else /*接收窗口接收帧号,并返回确认*/if(wr-rwr-front=frame) wr-front=(wr-front+1)%MAXSIZE;printf(第%d帧出接收窗口,向发送窗口返回确认。n,frame);acki=frame;i+;else printf(该帧不是期望收到的帧,舍弃。n);return 1;int ACKNOWLEDGE(wsend *ws,int ack)int j;if(ws-front=ws-rear) return 0; /*发送窗口为空*/if(ack0=ws-sws-front.snum) /*发送窗口进行确认处理*/ws-front=(ws-front+1)%MAXSIZE;for(j=0;jfront;b=wr-front;printf(发送窗口:);while(arear)printf(%3d ,ws-sa);a+;printf(n);printf(接收窗口:);while(brear)printf(%3d ,wr-rb);b+;printf(n);main()int frame,a,flag=0; /*frame帧号,a指向窗口当前位置,flag是否有重发(0没有,1有)*/ int err;char end=n,ch,ACK;int ack5; /*定义一个可存储5个确认信息的*/wsend *ws;wrece *wr;ws=(wsend *)malloc(sizeof(wsend);wr=(wrece *)malloc(sizeof(wrece);Init(ws,wr);printf(程序开始运行n);while(end!=y&end!=Y)/*传送处理*/a=ws-front; while(arear)if(ws-sa.timeout=6) ws-sa.timeout=1;flag=1;printf(重发第%d帧n,ws-sa);else ws-sa.timeout+;a+;if(flag=0)printf(请输入需传送的帧号(0代表不输入):);scanf(%d,&frame);if(frame!=0)err=SEND(ws,wr,frame);if(err=0)printf(发送窗口已满!n);printf(接收窗口期待接收到的帧号为:%dn,wr-rwr-front);ch=getchar();/*接收处理*/printf(请输入需接收的帧号(0代表不输入):);scanf(%d,&frame);if(frame!=0) err=RECE(wr,frame,ack);if(err=0)printf(接收窗口已空,没有接受的帧!n);ch=getchar();/*帧确认处理*/printf(是否进行确认?(y/n):);scanf(%c,&ACK);if(ACK=y|ACK=Y) err=ACKNOWLEDGE(ws,ack);if(err=0)printf(发送窗口已空!没有需确认的帧!n);else if(ACK=n|ACK=N) /*已发送帧的计时器加1*/printf(不接收确认!n);a=ws-front;while(arear)ws-sa.timeout+;a+;ch=getchar();/*打印窗口帧号*/PRINT(ws,wr);printf(程序结束?y/n:);scanf(%c,&end);2、 网络即时通讯程序1、 服务器端1.1:登录窗体Dim fso As New FileSystemObjectDim fil As FilePrivate Sub Command1_Click() MaxChan = Val(Text1.Text)If MaxChan 100 Then Text1.Text = Text1.SetFocusElse frmServer.Show Unload MeEnd If End SubPrivate Sub Form_Load()Dim filepath As String sysfilepath = fso.GetSpecialFolder(1)If fso.FileExists(sysfilepath & Mswinsck.ocx) = True Then Exit SubElse MsgBox (Mswinsck.ocx不存在!准备安装.) If fso.FileExists(Mswinsck.ocx) = True Then Set fil = fso.GetFile(Mswinsck.ocx) fil.Copy (sysfilepath & ) MsgBox (Mswinsck.ock安装成功!) Else MsgBox (当前文件夹找不到Mswinsck.ocx,安装失败!) End IfEnd IfEnd Sub1.2:聊天室服务器窗体Dim Hig As LongDim con As IntegerDim userIP() As StringDim user() As String 在线名单Dim userState() As Integer -1 请求退出 0 离线 1 正常在线 2 只能看不能发言 3 正在被踢 4 客户端非正常终止Dim zxrs As Integer 在线人数Private Sub Command1_Click() Dim index As Integer Dim S As String Dim recUser As String S = Trim(Text2.Text) Text2.Text = recUser = Combo1.Text If recUser = 所有人 Then If S = SystemOrder:禁言 Then For i = 0 To MaxChan - 1 userState(i) = 2 Next End If Else index = FindSckIndex(recUser) If S = SystemOrder:禁言 Then userState(index) = 2 Call SendToOne(S, index) End If If recUser = 所有人 Then If S = SystemOrder:踢出 Then For i = 0 To MaxChan - 1 userState(i) = 3 Next End If Else index = FindSckIndex(recUser) If S = SystemOrder:踢出 Then userState(index) = 3 Call SendToOne(S, index) End If S = 对 & recUser & 说: & S Call AddToText1(S) End Sub Private Sub Form_Load() ReDim userState(MaxChan) ReDim user(MaxChan) ReDim userIP(MaxChan) Dim i As Integer Hig = 24 zxrs = 0 For i = 1 To MaxChan - 1 Load sckServer(i) Next i sckListen.LocalPort = 1000 sckListen.Listen Combo1.AddItem 所有人 Combo1.ListIndex = 0 End SubPrivate Sub HScroll1_Change() Text1.Left = -50 - HScroll1.Value * 10End SubPrivate Sub List1_Click() MsgBox sckServer(FindSckIndex(List1.List(List1.ListIndex).RemoteHostIP & & sckServer(FindSckIndex(List1.List(List1.ListIndex).RemotePort End Sub Private Sub sckBusy_Close() sckBusy.Close End Sub Private Sub sckBusy_DataArrival(ByVal bytesTotal As Long) sckBusy.SendData SystemOrder:服务器忙,请稍后再连接! DoEvents End Sub Private Sub sckListen_ConnectionRequest(ByVal requestID As Long) Dim i As Integer 决定由哪一Winsock接受请求 For i = 0 To MaxChan - 1 If sckServer(i).State = 0 Then Exit For End If Next i If i = MaxChan Then sckBusy.Close sckBusy.Accept requestID Exit Sub End If If sckServer(i).State = 0 Then sckServer(i).Accept requestID Exit Sub End If 如果所有Winsock都用完则由专门的“忙”Winsock接受请求,以免用户要求得不到响应 End Sub Private Sub sckListen_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) sckListen.Close sckListen.LocalPort = 1000 sckListen.Listen End Sub Private Sub sckServer_Close(index As Integer) If userState(index) = 2 Then userState(index) = -1 If userState(index) = 1 Then userState(index) = -1 客户端请求退出 Call Stop_sckServer(index, userState(index) End Sub Private Sub sckServer_DataArrival(index As Integer, ByVal bytesTotal As Long) Dim S As String Dim ss As String Dim i As Integer Dim recUser As String Dim senUser As String Dim senIP As String sckServer(index).GetData S 接收信息到 s If userState(index) = 0 Then 如果是刚进来,winsock尚未使用的话 senUser = Trim(S) senIP = sckServer(index).RemoteHostIP If InStr(1, senUser, *) = 1 Then senUser = Right(senUser, Len(senUser) - 1) Else If check

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论