通信网原理课程设计报告.docx
中 南 大 学通信网原理课程设计报告 专业班级 电子信息1002班 姓名学号 指导教师 陈科文、支国明、周扬 设计时间 2013年7月 电子信息工程系 信息科学与工程学院 目录 第一章 距离矢量路由算法实现11.1、课程设计目的与主要任务11.1.1、课程设计目的11.1.2、课程设计主要任务11.2、课程设计题目和设计21.3、设计思想31.4、编程实现过程的详细说明51.4.1、程序界面设计51.4.2、总体工作流程图51.4.3、关键函数和语句的说明61.4.4、设计结果的演示与分析等。101.5、设计总结111.6、参考文献111.7、附录:源程序代码12第二章 文件传输192.1、课程设计目的与主要任务192.1.1、课程设计目的192.1.2、课程设计主要任务192.2、课程设计题目和设计202.3、设计思想212.4、编程实现过程的详细说明232.4.1、程序界面设计232.4.2、总体工作流程图232.4.3、设计结果的演示与分析242.5、设计总结272.6、参考文献272.7、附录:源程序代码28第一章 距离矢量路由算法的实现1.1 课程设计目的及主要任务 本次课程设计的目的是通 过将理论与实践相结合,使学生进一步深入理解通信网的工作原理,掌握网络应 用开发技术,学会应用所学理论知识来分析和解决实际问题,培养网络技术研究 与开发的基本能力以及创新精神。本课程设计的主要任务是在 掌握计算机网络TCP/IP等典型协议原理的基础上,通过编程设计对网络协议或 算法进行模拟实现,并应用相应网络协议来开发一个网络应用系统。1.2 课程设计要求(1)系统功能要求:编写距离矢量路由选择算法演示程序,能根据网络拓扑和线路延迟的变化自动更新路由表,并输出结果。可从文件(格式自定)中读取网络拓扑结 构,包括连通状态和直连两点间延迟,可输出任一点的邻接结点和对应的延迟。按照图的最短路径算法构造网络的初始路由表,能输出任意两点间的延迟 和最短路径;可以改变任一点邻接结点的路由表和之间的延迟,按照距离矢 量路由选择算法计算出新的路由表。要求: 能正确的输出路由信息。 (2)运行条件:基于C_free程序的平台(3)用户操作要求:能够输入相应路由值,并能继续或结束程序运行1.3 设计思想 (1)实验原理:路由以矢量(距离、方向)的方式被通告出去的,其中距离是根据度量来定义的,方向是根据下一跳路由器定义的。被认为是“依照传闻进行路由选择”,RIP协议使用距离矢量算法,网络工作时路由器之间利用此协议更新路由表项,每隔2分钟更新一次。路由表项格式:(direction,jump,next)分别表示目的网络地址,跳数(距离),下一跳路由地址当某路由器A收到相邻路由器B发来的路由信息(D,J,N)后执行以下分析:首先修改(D,J,N)(D,J1,B)1 如果A没有到D的路由信息,则生成路由表项(D,J1,B);否则22 A有到D的路由信息(D,?,B)?就是116任意值,则将其更新为(D,J1,B);否则33 A有到D的路由信息(D,K,X)其中KJ1,X!B,则将其更新为(D,J1,B);否则44 什么都不做。这是自己做本实验时总结的原理。 (2)关键问题:要实现线路延迟的变化即时更新路由表;构造最短路径程序。1.4 程序设计(1)流程图接受到数据包YES广播帧广播帧?NOYES将帧发送到其上层为本设备的帧?NO目的设备为本设备的子设备YES直接到目的设备路由NONO是否有路由能力NONONO是否选择路由为该目的路由沿树选择路由YESYES开始选择最短路由到下一跳路由(2) 关键函数说明:第一个是INITDATA: void InitData(FILE *pfile)char num10;int i = 0;char c;int m, n;fseek(pfile, 0, 0); /文件指针从距0位置0距离开始读取for (m = 0; !feof(pfile) && m < 7; m+) /feof(pfile),文件尾返回1,不是返回0.即不是文件尾部且m<7循环.for (n = 0; !feof(pfile) && n < 7; n+)while (!feof(pfile)c = fgetc(pfile); /读取单个字节if (c = ',')/*读完一个数字*/numi = '0' /赋值为空datamn.dis = atoi(num);/atoi将字符变成数字,将路由权值给data.disdatamn.from = -1; /直接相连下一跳全都赋值为-1i = 0;break; /*end of if*/else if (c >= '0' && c <= '9') | c = '-') /*如果读到数字或符号.本题路由权值只能0到9*/numi+ = c; /*end of else if*/ /*end of while*/ /*end of for (n = 0*/ /*end of for (m = 0*/第二个是Outputroutdata: void OutputRoutData()int i, j;printf(" ");for (i = 0; i < MAX_ROUTES; i+)printf(" %c ", i + 65);printf("n");for (i = 0; i < MAX_ROUTES; i+)printf("%c ", i + 65);for (j = 0; j < MAX_ROUTES; j+)if (dataij.dis < 0)/如果无路径printf(" -");elseif(dataij.dis>=10)printf(" %d", dataij.dis);elseprintf(" %d", dataij.dis);if (dataij.from < 0)/如果未经过其它节点 所以直接相连的路由下一跳为-1printf(" - ");elseprintf(" %c ", dataij.from + 65); /输出下一跳路由 printf("n"); void Communication(int recv, int send) /相连的两路由recv和send交换数据计算一次得到暂时最短距离int i;for (i = 0; i < MAX_ROUTES; i+)if (datasendi.dis > 0)/如果send节点到i号节点有路线if (datarecvi.dis < 0)/如果recv到i号节点无路径 datarecvi.dis = datasendi.dis + datarecvsend.dis; /第一种recv不与i相连,recv到不与他相连的i的延迟datarecvi.from = send; /下一跳为sendelse if (datarecvi.dis > datasendi.dis + datarecvsend.dis)/第二种recv与i相连,且直接相连值大于间接到i的延迟 /如果现有路径比新路径远datarecvi.dis = datasendi.dis + datarecvsend.dis; /将recv到i的延迟改为间接延迟的值datarecvi.from = send; /下一跳改为send void Exchange() /实现所有相连的两路由进行数据交换并计算最短数值int i, j;for (i = 0; i < MAX_ROUTES; i+)for (j = 0; j <MAX_ROUTES; j+)if (dataij.dis > 0)/如果两个节点之间有路径Communication(j, i);/将i号节点的路由表发送给j号节点 第三个是主函数: main() int start, end, i, j;FILE *pfile;pfile = fopen("1.txt", "r");if (pfile = NULL)printf("文件打开错误,按任意键退出.n");getch();return 0;elseprintf("n路由表初始:n");InitData(pfile);fclose(pfile);for (i = 0; i<MAX_ROUTES; i+)printf("%c|", i + 65);for (j = 0; j < MAX_ROUTES; j+)if (dataij.dis > 0)printf("<%c %d> ", j + 65, dataij.dis);printf("n"); /显示各路由的路由表 Exchange(); /更新路由表 printf("n路由表交换:n");OutputRoutData();printf("输入起始路由节点数字(%d-%d)0代表A,1代表B. : ", 0, MAX_ROUTES - 1);scanf("%d", &start);printf("输入终点路由节点数字(%d-%d)0代表A,1代表B. : ", 0, MAX_ROUTES - 1);scanf("%d", &end);if (start = end | start < 0 | start > 6 | end < 0 | end > 6)printf("n输入错误,请按任意键退出n");getch();return 0;elseint cur = start;int total = 0;if (datastartend.dis < 0)printf("没有路由路径发现!n");getch();return 0; printf("%c->", cur + 65);while (datacurend.from >= 0) /起始点与终点不相连。0是Atotal += datacurdatacurend.from.dis; /total变成cur与下一跳的延迟printf("%c->", datacurend.from + 65);cur = datacurend.from; /起始路由变成下一跳 total += datacurend.dis;printf("%cn总的路由距离 = %d", end + 65, total);getch();return 0; (3) 设计结果演示:运行程序后,显示初始认为设计的路由表的各项权值,设计思想是-1代表无穷。出现路由表的交换,路径权值。如图(1)所示:图(1)输入始末路由节点后,程序会计算出最短路径,并显示出来,还会自动计算最短路径的权值。如图(2)所示:图(2)A(4) 网络拓扑图5287GBE1543DC9F1.5 参考文献1(美)Larry L.Peterson,Bruce S.Davie 著,薛静锋,等译.计算机网络:系统方法 (第4 ).北京:机械工业出版社.2 吴英编著.计算机网络应用软件编程技术.北京:机械工业出版社,20103 谭浩强著C程序设计(第四版) 清华大学出版社第二章 文件传输程序2.1 课程设计目的及主要任务 本次课程设计的目的是通 过将理论与实践相结合,使学生进一步深入理解通信网的工作原理,掌握网络应 用开发技术,学会应用所学理论知识来分析和解决实际问题,培养网络技术研究 与开发的基本能力以及创新精神。本课程设计的主要任务是在 掌握计算机网络TCP/IP等典型协议原理的基础上,通过编程设计对网络协议或 算法进行模拟实现,并应用相应网络协议来开发一个网络应用系统。2.2 课程设计要求(1)系统功能要求:包括客户端和服务器程序,应实现以下功能:(1)客户端既能上 传文件到服务器,也能从服务器下载文件;(2)在客户端上可显示文件基本信息 和传输状态信息,可浏览服务器上供下载的文件列表,选择某文件下载到本地某 目录下;(3)服务器端能接收客户端上传的文件,并保存在某一目录下;也能响 应客户端的文件浏览与下载请求;(4)增加其它附加创新功能。程序应具有图形 化界面,美观友好。 (2)运行条件:基于Microsoft Visual Basic 6.0软件与WINSOCK控件。(3) 用户操作要求:能显示出文件传输设计界面,能运行界面上的操作按钮,并能即时开启和关闭程序。(4)2.3 设计思想 (1)实验原理:FTP的主要功能是在主机间高速可靠地传输文件。目前FTP仍然保持其可靠性,即使在今天,它还允许文件远程存取。这使得用户可以在某个系统上工作,而将文件存贮在别的系统。例如,如果某用户运行Web服务器,需要从远程主机上取得HTML文件和CGI程序在本机上工作,他需要从远程存储站点获取文件(远程站点也需安装Web服务器)。当用户完成工作后,可使用FTP将文件传回到Web服务器。采用这种方法,用户无需使用Telnet登录到远程主机进行工作,这样就使Web服务器的更新工作变得如此的轻松。 FTP是TCP/IP的一种具体应用,它工作在OSI模型的第七层,TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,这样FTP客户在和服务器建立连接前就要经过一个被广为熟知的"三次握手"的过程,它带来的意义在于客户与服务器之间的连接是可靠的,而且是面向连接,为数据的传输提供了可靠的保证。而设计本实验的时候,利用VB程序设计,是运用Winsock控件来进行两台计算间的文件传输。随着计算机网络的迅速发展,人们的生活越来越离不开网络,如今网络编程已成为计算机发展的热点,而在众多的网络通信中,又以TCP/IP协议最为流行。本文讨论的Winsock控件,提供了访问TCP/IP网络的捷径,使用它可以不必了解TCP/IP的细节和调用Winsock API,只要设置好相应的属性和触发事件后的处理,就可以实现计算机之间的数据通信.Winsock即Windows Sockets规范的简称,是目前最流行的网络通信应用程序接口之一。所谓Socket,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。Winsock控件工作在传输层上,在这一层上,目前主要流行的协议包括TCP和UDP两种:TCP协议适用于那些对于数据的可靠性要求比较高的情况,目前大多数的网络应用层协议都是基于TCP协议的(例如常用的HTTP、FTP、SMTP、POP3等协议);UDP协议适用于对数据可靠性要求不高而对速度要求较高的情况,这里主要包括一些需要大流量的.Winsock控件是基于Socket规范创建的,所以其通信的实质是对Socket接口进行数据的读写操作。如果两个应用程序需要通信,它们可以通过使用Socket类来建立套接字连接,可以将这个过程想象为一次电话呼叫过程:呼叫者通过拨号与被呼叫者连接,当电话接通时,双方都可以自由通话了,只不过这里的呼叫者被称为“客户”,被呼叫者则称为“服务器”,而号码则为“IP地址+端口”,但在建立连接之前,必须由“客户”发出呼叫,且此时的“服务器”正在监听。因此,基于TCP/IP协议的通信,需要分别建立客户端应用程序和服务器端应用程序。2.4 程序设计(1) 流程图 主程序流程图 发送数据流程图 接受处理流程图开始开始开始建立连接操作系统初始化查询TCP SOCKET是否连接创建任务查看连接状态与服务器IP地址或端口号进行TCP连接开始任务在TCP通道上收到数据?接受数据任务发送数据信息NN解码收到的数据发送延迟?发送完毕YY进行相应的操作休眠或关闭连接发送数据任务 (2) 关键函数说明:Option ExplicitDim FilePath As String, FileSend As BooleanDim filename As String, FileLen As LongConst Text = "文件名: 未选择文件" & vbCrLf & vbCrLf & "文件长度: 未选择文件"Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPrivate Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As LongPrivate Type POINTAPI X As Long Y As LongEnd TypeDim MousePos As POINTAPIDim FileByt() As BytePrivate Sub Com_OK_Click()On Error GoTo ErrIf Com_OK.Caption = "侦听" Then Winsock1.Close Winsock1.RemotePort = 0 Winsock1.LocalPort = Val(T_Prot) Winsock1.Listen CenterPrint Pic_Connect, "正在侦听"Else Winsock1.Close Winsock1.RemoteHost = T_PCIP Winsock1.LocalPort = 0 Winsock1.RemotePort = Val(T_Prot) Winsock1.ConnectCenterPrint Pic_Connect, "正在连接"End IfExit SubErr:MsgBox Err.Description, 16, Err.NumberEnd SubPrivate Sub Com_Close_Click()Dim Temp As ByteIf FileSend = True Then Temp = MsgBox("当前正在传输文件,确定要中断连接?", 289, "提示")Else Temp = 1End IfIf Temp = 1 Then Winsock1_CloseEnd SubPrivate Sub Com_Send_Click()If Com_Send.Caption = "发送文件" Then If Winsock1.State = 7 Then If FileLen > 0 And FilePath <> "" Then Winsock1.SendData UTF8_Encode("101") Winsock1.SendData UTF8_Encode(filename) Com_Send.Caption = "取消发送" SendFile.Text = "正在等待对方响应" FileSend = True Else MsgBox "尚未选择文件或文件长度为零", 64, "提示" End If Else MsgBox "请先建立连接!", 64, "提示" End IfElse Winsock1.SendData UTF8_Encode("255") FileSend = False Com_Send.Caption = "发送文件" Label4 = "工作状态:空闲"End IfEnd SubPrivate Sub command4_click()EndEnd SubPublic filename1 As String '定义变量,存放文件名Public filenum As Integer '定义变量,设置文件号Private Sub command1_click()filenum = FreeFile() '求空闲的文件号Open filename1 For Input As filenum '以文件号打开文件MsgBox "文件" & filename1 & "已打开"End SubPrivate Sub command2_click()While Not EOF(filenum) '取文件内容Input #filenum, str1T_File.Text = T_File.Text & Chr(10) & Chr(13) & str1 & Chr(10) & Chr(13)Wend '显示到文本框中Close '关闭文件End SubPrivate Sub dir1_change()File1.Path = Dir1.Path '改变目录列表框时,文件列表框的副目录也改变End SubPrivate Sub drive1_change() Dir1.Path = Drive1.Drive '改变磁盘时,目录列表框的根发生变化 End Sub Private Sub file1_click() filename1 = File1.Path & "" & File1.filename '取得文件名 End SubPrivate Sub Form_Load()SetWindowIcon Me, 101Form_ResizeCenterPrint Pic_IP, "PCIP:"CenterPrint Pic_Prot, "Prot:"CenterPrint Pic_Connect, "已准备就绪"Option_Click (0)T_Prot.SelStart = Len(T_Prot)T_File = TextEnd SubPrivate Sub Form_Resize()If Me.WindowState <> 1 Then 'Me.Height = Frame1.Height + Frame2.Height + 120 + 615 'Me.Width = Frame2.Width + 330End IfEnd SubPrivate Sub Form_Unload(Cancel As Integer)If Winsock1.State = 7 Then MsgBox "检测到尚有未关闭的连接,请先关闭连接。", 64, "提示" Cancel = 2Else Close #1End IfEnd SubPrivate Sub Option_Click(Index As Integer)On Error Resume NextIf Index = 0 Then T_PCIP = Winsock1.LocalIP T_PCIP.Enabled = False Com_OK.Caption = "侦听" T_Prot.SelStart = Len(T_Prot) T_Prot.SetFocusElse T_PCIP = "" T_PCIP.Enabled = True Com_OK.Caption = "连接" T_PCIP.SetFocusEnd IfWinsock1.CloseCenterPrint Pic_Connect, "已准备就绪"End SubPrivate Sub Picture2_Click()End SubPrivate Sub T_File_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)On Error GoTo ErrFilePath = Data.Files(1)filename = Mid(FilePath, InStrRev(FilePath, "") + 1)Close #1Open FilePath For Binary As #1FileLen = LOF(1)T_File = "文件名:" & filename & vbCrLf & vbCrLf & "文件长度:" & FileLenExit SubErr:If Err.Number = 75 Then MsgBox "文件打开错误,无法发送!", 4096 + 16, "提示"Else MsgBox Err.Description, 4096 + 16, Err.NumberEnd IfEnd SubPrivate Sub Timer1_Timer()GetCursorPos MousePosIf Picture2.hwnd <> WindowFromPoint(MousePos.X, MousePos.Y) Then Picture2.Visible = False Timer1.Enabled = False Frame1.Enabled = True Frame2.Enabled = True Frame3.Enabled = TrueEnd IfEnd SubPrivate Sub Winsock1_Close()Winsock1.CloseCenterPrint Pic_Connect, "连接已被中断"Frame1.Enabled = TrueLabel3 = "建立连接:尚未连接"Label4 = "工作状态:尚未连接"Com_Send.Caption = "发送文件"Com_Send.Enabled = TrueFileSend = FalseSendFile.Value = 0SendFile.Text = "文件传输进度"End SubPrivate Sub Winsock1_Connect()CenterPrint Pic_Connect, "已建立连接"Frame1.Enabled = FalseT_PCIP = Winsock1.RemoteHostIPLabel3 = "建立连接:" & TimeLabel4 = "工作状态:空闲"End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)Winsock1.CloseWinsock1.Accept requestIDCenterPrint Pic_Connect, "已建立连接"Frame1.Enabled = FalseLabel3 = "建立连接:" & TimeLabel4 = "工作状态:空闲"End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)Dim ComByte As Long, Temp As Long, J As LongStatic DataByt() As ByteStatic FileByt() As ByteStatic Received As LongConst PACKSIZE = 8192 '65536ReDim DataByt(bytesTotal)Winsock1.GetData DataByt, vbArray + vbByte'-获取指令ComByte = Val(Left(UTF8_Decode(DataByt), 3) Select Case ComByte'-文件请求发送接收或拒绝 Case Is = 101 filename = Mid(UTF8_Decode(DataByt), 4) If MsgBox("对方请求发送文件" & filename & "是否接收?", vbYesNo + 32 + 4096, "提示") = 6 Then Label4 = "工作状态:正在接收数据." Winsock1.SendData UTF8_Encode("201") '同意请求 FileSend = True Else Winsock1.SendData UTF8_Encode("202") '拒绝请求 End If'-文件长度发送断点位置 Case Is = 102 On Error GoTo OpenErr: Dim N As Long Dim LName As String, RName As String FileLen = Val(Mid(UTF8_Decode(DataByt), 4) LName = Left(filename, InStrRev(filename, ".") - 1) RName = Mid(filename, InStrRev(filename, ".") Do While Dir(filename) <> ""