基于TCP的文件传输程序_第1页
基于TCP的文件传输程序_第2页
基于TCP的文件传输程序_第3页
基于TCP的文件传输程序_第4页
基于TCP的文件传输程序_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

基于TCP协议的简单即时通信软件的设计与实现基于TCP的文件传输程序页脚内容PAGE页脚内容PAGE32基于TCP协议的简单即时通信软件的设计与实现页脚内容PAGE《计算机网络系统实践》报告设计题目设计题目:网络文件传输学生姓名:郑波学号:2013211644专业班级:计算机科学与技术13-2班2015年12月基于TCP的文件传输程序全文共33页,当前为第1页。基于TCP的文件传输程序全文共33页,当前为第1页。设计要求实现单线程文件传输功能在以上的基础上,掌握多线程技术,在文件网络传输时,可选择单线程或多线程加入异常控制机制,增强程序的鲁棒性(Robust)了解如何提高套接字传输的速率,以及如何加强传输的稳定性二、开发环境与工具Windows7下MicrosoftVisualStuio三、设计原理1、网络传输协议 TCP/IP协议栈中的两个协议: TCP(TransmissionControlProtocol):传输控制协议 UDP(UserDatagrmProtocal):用户数据报协议TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。该连接一旦建立,两台计算机之间就可以把数据当做一个双向字节流进行交换。UDP是无连接的通信协议,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接受发自若干个源的数据。就是说,如果一个主机向另外一台主机发送数据,这个数据就会立即发出,而不管另外一台主机是否已准备接收数据。如果另外一台主机接收到了数据,它不会确认收到与否。本次工程目的是传输文件,显然需要用TCP建立连接,而TCP连接需要“三次握手”。基于TCP的文件传输程序全文共33页,当前为第2页。2、三次握手基于TCP的文件传输程序全文共33页,当前为第2页。 三次握手具体过程:1、客户端主动与服务器联系,TCP首部控制位中的SYN设置为1,发送带有SYN的TCP段,并把初始序号告诉对方2、服务端收到带有SYN的报文,记录客户端的初始序号,选择自己的初始序号,设置控制位中的SYN和ACK。因为SYN占用一个序号,所以确认序号设置为客户端的初始序号加1,对客户端的SYN进行确认3、服务端的报文到达客户端,客户端设置ACK控制位,并把确认好设为服务器的初始序号加1,以确认服务器的SYN报文段,这个报文只是确认消息,告诉服务器已经成功建立了连接四、系统功能描述及软件模块划分 1、系统功能描述 软件实现了点对点的文件传输。传输前的接收提醒以及传输过程中的控制。2、软件模块划分基于TCP的文件传输程序全文共33页,当前为第3页。本程序可以划分成以上三个模块:传输控制模块,文件传输模块和服务连接模块。其中:基于TCP的文件传输程序全文共33页,当前为第3页。服务连接模块用来建立客户端到服务器的连接 文件传输模块主要用两个线程:_SendThread和_ListenThread来完成,实现发送和接收文件的功能。 传输控制模块主要通过封装好的可串行化信息类CMessage互相传递两端的文件操作消息,响应“暂停传输”,“关闭连接”等功能五、设计步骤1、服务连接模块 先要建立起客户端与服务器之间的连接,大致过程如下:服务器启动:if(m_nServerType==SERVER) { //创建服务器套接字 m_psockServer=newCListenSocket(this); if(!m_psockServer->Create(m_wPort))//绑定端口 { deletem_psockServer; m_psockServer=NULL; MessageBox(GetError(GetLastError()),_T("错误"),MB_ICONHAND); return; } //开启线程,监听客户端连接 if(!m_psockServer->Listen()) { deletem_psockServer; m_psockServer=NULL;基于TCP的文件传输程序全文共33页,当前为第4页。 MessageBox(GetError(GetLastError()),_T("错误"),MB_ICONHAND);基于TCP的文件传输程序全文共33页,当前为第4页。 return; } }客户端填入相应的IP地址,连接服务器 if(((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS))->IsBlank()) { MessageBox("IP地址不能为空","错误",MB_ICONHAND); return; } //创建客户端套接字 m_psockClient=newCClientSocket(this); if(!m_psockClient->Create()) { deletem_psockClient; m_psockClient=NULL; MessageBox(GetError(GetLastError()),_T("错误"),MB_ICONHAND); return; } //与服务器建立连接 CStringstrIPAddress; GetDlgItem(IDC_IPADDRESS)->GetWindowText(strIPAddress); if(!m_psockClient->Connect(strIPAddress,m_wPort))//Connect连接服务器,服务器用OnAccept响应 { deletem_psockClient; m_psockClient=NULL; MessageBox(GetError(GetLastError()),_T("错误"),MB_ICONHAND); return; } //初始化客户端套接字 m_psockClient->Init();服务器响应 CClientSocket*pSocket=newCClientSocket(this);基于TCP的文件传输程序全文共33页,当前为第5页。 //接收请求后获得新的套接字,交由新的套接字处理请求基于TCP的文件传输程序全文共33页,当前为第5页。 if(m_psockServer->Accept(*pSocket))//非零则接收连接请求成功 { //初始化Accpet返回的套接字 pSocket->Init(); CMessage*pMsg; //检测套接字是否为空,空则还没有连接任何客户端 if(m_psockClient==NULL) { pMsg=newCMessage(CONNECT_BE_ACCEPT); pSocket->SendMsg(pMsg); //发回“这边可以连接”消息回去,客户端的Receive接收 m_psockClient=pSocket;//若为服务器,则之前未初始化,可保存这个套接字,用来跟客户端交互 GetDlgItem(IDC_SELECT_FILE)->EnableWindow(TRUE); } else { pMsg=newCMessage(CONNECT_BE_REFUSE); pSocket->SendMsg(pMsg); } }客户端收到连接成功消息 if(pMsg->m_nType==CONNECT_BE_ACCEPT) { GetDlgItem(IDC_SELECT_FILE)->EnableWindow(TRUE); return; }2、传输控制模块 该工程用了两对套接字,一对用来接收传输控制消息,一对用来收发文件。我们这个模块用的是第一对 在MFC中定义了一个在套接字编程中使用的CSocketFile类,可以充分发挥CSocket类的特性。CSocketFile类是CFile的派生类,主要用来在WindowsSockets编程中发送和接收序列化数据(如结构体数据)。通过把CSocketFile类对象、CArchive对象和CSocket创建的套接字对象联系起来,可以实现数据的加载(接收)和存储(发送)。基于TCP的文件传输程序全文共33页,当前为第6页。 MFC集成CSocketFile、CSocket、CArchive可以简化网络传输。下图可以直观地反应这三者是如何结合来在客户端和服务器之间传输消息的基于TCP的文件传输程序全文共33页,当前为第6页。先来看看服务器和客户端的套接字初始化工作: m_pFile=newCSocketFile(this); m_pArchiveIn=newCArchive(m_pFile,CArchive::load); m_pArchiveOut=newCArchive(m_pFile,CArchive::store);这样一来,当使用m_pArchiveIn对象来调用可串行化消息类CMessage的Serialize时,接收方就能响应OnReceive消息,来完成控制信息的传递。 本工程在主类CsendFileDlg中定义了传输的三种状态: m_bIsWait: 已连接,正在等待传输文件 m_bIsTransmitting:正在传输文件 m_bIsStop: 传输已终止基于TCP的文件传输程序全文共33页,当前为第7页。本工程定义的可串行化消息类CMessage,用来传递文件名m_strFileName、文件长度m_dwFileSize以及当前的传输状态m_nType,大致流程如下图:基于TCP的文件传输程序全文共33页,当前为第7页。其中,我在建工程的时候,把客户端和服务器集成在了一个界面OnReceive就用来接收两方的消息,关键代码如下: CMessage*pMsg=newCMessage(); pSocket->ReceiveMsg(pMsg); if(pMsg->m_nType==CONNECT_BE_ACCEPT) { GetDlgItem(IDC_SELECT_FILE)->EnableWindow(TRUE); return; } if(pMsg->m_nType==CONNECT_BE_REFUSE) { MessageBox(_T("服务器正在和另外的客户端连接,稍等"),_T("错误"),MB_ICONHAND); deletem_psockClient; m_psockClient=NULL; return; } if(pMsg->m_nType==DISCONNECT) { MessageBox(_T("对方已经关闭"),_T("警告"),MB_ICONHAND); if(m_psockClient!=NULL) {基于TCP的文件传输程序全文共33页,当前为第8页。 deletem_psockClient;基于TCP的文件传输程序全文共33页,当前为第8页。 m_psockClient=NULL; } } //接收请求 if(pMsg->m_nType==REQUEST) { m_bIsWait=TRUE;//忙状态置1 m_strFileName=pMsg->m_strFileName; m_dwFileSize=pMsg->m_dwFileSize; CStringstrName,strSize; strName.Format("文件名:%s",m_strFileName); strSize.Format("文件大小:%ld字节",strSize); //这里完成了发送文件前给对方提示的功能 if(MessageBox(strName+"\r\n"+strSize,"对方请求向你发送文件",MB_OKCANCEL)==IDCANCEL) { CMessage*pMsg=newCMessage(REFUSE); m_psockClient->SendMsg(pMsg); return; } CFileDialogdlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"所有文件(*.*)|*.*||",this); dlg.m_ofn.lpstrTitle=_T("另存为"); strcpy(dlg.m_ofn.lpstrFile,m_strFileName.GetBuffer(m_strFileName.GetLength())); if(dlg.DoModal()==IDOK){ if(m_bIsWait==FALSE){ MessageBox(_T("对方已经取消文件发送"),_T("警告"),MB_ICONEXCLAMATION); return; } m_bIsClient=FALSE; m_strPath=dlg.GetPathName(); //启动接收文件的线程 GetDlgItem(IDC_SR)->SetWindowText("已接收:"); pThreadListen=::AfxBeginThread(_ListenThread,this);//服务器接收到RUEST,开启接收文件线程 return; } if(m_bIsWait==TRUE)基于TCP的文件传输程序全文共33页,当前为第9页。 { 基于TCP的文件传输程序全文共33页,当前为第9页。 //告诉对方文件发送请求被拒绝CMessage*pMsg=newCMessage(REFUSE); m_psockClient->SendMsg(pMsg); } m_bIsWait=FALSE; return; } //当对方同意,并且已经准备好接收文件的时候 if(pMsg->m_nType==ACCEPT) { KillTimer(1); m_bIsWait=FALSE;//等待状态清空 //启动发送文件线程 GetDlgItem(IDC_SR)->SetWindowText("已发送:"); pThreadSend=::AfxBeginThread(_SendThread,this); return; } //当发送文件请求被拒绝 if(pMsg->m_nType==REFUSE){ m_bIsWait=FALSE; MessageBox(_T("请求被拒绝"),_T("警告"),MB_ICONEXCLAMATION); return; } //当对方取消文件传输时执行该if语句里面的内容if(pMsg->m_nType==CANCEL) { m_bIsWait=FALSE; return; }3、文件传输模块 两个线程: _ListenThread():建立新的监听套接字,准备接收文件 _SendThread():建立客户端套接字,连接监听套接字,发送文件基于TCP的文件传输程序全文共33页,当前为第10页。 当两方建立了可靠的连接,一方选择文件后,就会使用传输控制模块给对方发送文件发送请求,对方的ProcessReceive接收到后查看当前的消息状态,(上个模块的OnReceive已经写得很清楚),同意接受后,开启文件接收线程,同时给发送方返回一个准备完成状态,于是,发送方开启文件发送线程,最后完成文件的传输工作,同时置状态m_bIsStop为TRUE,便于双方传输控制基于TCP的文件传输程序全文共33页,当前为第10页。发送线程关键函数SendFilevoidCSendFileDlg::SendFile(CSocket&senSo){ m_bIsTransmitting=TRUE; CFilefile; if(!file.Open(m_strPath,CFile::modeRead|CFile::typeBinary)) { AfxMessageBox(_T("文件打开失败")); senSo.Close(); return; } m_ctrlProgress.SetRange32(0,m_dwFileSize); intnSize=0,nLen=0; DWORDdwCount=0; charbuf[BLOCKSIZE]={0}; file.Seek(0,CFile::begin); //开始传送基于TCP的文件传输程序全文共33页,当前为第11页。 while(1)基于TCP的文件传输程序全文共33页,当前为第11页。 { //每次读取BLOCKSIZE大小 nLen=file.Read(buf,BLOCKSIZE); if(nLen==0) break; //发送文件内容 nSize=senSo.Send(buf,nLen); dwCount+=nSize; m_ctrlProgress.SetPos(dwCount); CStringstrTransfersSize; strTransfersSize.Format("%ld字节",dwCount); //设置进度条属性 GetDlgItem(IDC_RECEIVE_SIZE)->SetWindowText(strTransfersSize); intp=((double)dwCount)/((int)m_dwFileSize+1)*100+1; strTransfersSize.Format("%d",p); strTransfersSize+="%"; //判断用户是否停止发送 if(m_bIsStop) { m_bIsStop=FALSE; break; } if(nSize==SOCKET_ERROR) break; } file.Close(); senSo.Close(); if(m_dwFileSize==dwCount) AfxMessageBox(_T("文件发送成功")); else AfxMessageBox(_T("文件发送失败")); m_ctrlProgress.SetPos(0); m_bIsTransmitting=FALSE; }接收线程关键函数ReceiveFilevoidCSendFileDlg::ReceiveFile(CSocket&recSo){基于TCP的文件传输程序全文共33页,当前为第12页。 //停止等待超时计时器基于TCP的文件传输程序全文共33页,当前为第12页。 KillTimer(2); m_bIsWait=FALSE; m_bIsTransmitting=TRUE;//正在传输置1 m_ctrlProgress.SetRange32(0,m_dwFileSize); intnSize=0; DWORDdwCount=0; charbuf[BLOCKSIZE]={0}; CFilefile(m_strPath,CFile::modeCreate|CFile::modeWrite); //开始接收文件 while(1) { //每次接收BLOCKSIZE大小的内容 nSize=recSo.Receive(buf,BLOCKSIZE); if(nSize==0) break; //写入文件 file.Write(buf,nSize); dwCount+=nSize; m_ctrlProgress.SetPos(dwCount); CStringstrTransfersSize; strTransfersSize.Format("%ld字节",dwCount); GetDlgItem(IDC_RECEIVE_SIZE)->SetWindowText(strTransfersSize); intp=((double)dwCount)/((int)m_dwFileSize+1)*100+1; strTransfersSize.Format("%d",p); strTransfersSize+="%"; GetDlgItem(IDC_PECENT)->SetWindowText(strTransfersSize) //用户是否停止了接收 if(m_bIsStop) { m_bIsStop=FALSE; break; } } file.Close(); recSo.Close(); if(m_dwFileSize==dwCount) AfxMessageBox(_T("文件接收成功"));基于TCP的文件传输程序全文共33页,当前为第13页。 else基于TCP的文件传输程序全文共33页,当前为第13页。 AfxMessageBox(_T("文件接收失败")); m_ctrlProgress.SetPos(0); m_bIsTransmitting=FALSE;}六、关键问题及其解决方法1、在传输文件前、中、后能让程序响应各类控制消息集成后的互通消息代码集成后的互通消息代码很简单:voidSerialize(CArchive&ar){ if(ar.IsStoring()){ ar<<m_nType; ar<<m_strFileName; ar<<m_dwFileSize; } else { ar>>m_nType; ar>>m_strFileName; ar>>m_dwFileSize; }} 2、解决单线程传输阻塞的非“非阻塞”式方法在使用AfxBeginThread实现多线程的同时,也增加了诸如发送超时、接收超时等判断(使用Windows定时器SetTimer响应OnTime来实现),这一定程度上增强了程序的鲁棒性文件的传输时阻塞式的,所以在主线程中直接传输文件必然导致界面卡死,所以在使用AfxBeginThread实现多线程的同时,也增加了诸如发送超时、接收超时等判断(使用Windows定时器SetTimer响应OnTime来实现),这一定程度上增强了程序的鲁棒性_ListenThreadUINT_ListenThread(LPVOIDlparam)基于TCP的文件传输程序全文共33页,当前为第14页。{基于TCP的文件传输程序全文共33页,当前为第14页。 CSendFileDlg*pDlg=(CSendFileDlg*)lparam; //创建服务器端套接字 CSocketsockSrvr; if(!sockSrvr.Create(pDlg->m_wPort+PORT)) { pDlg->TransfersFailed(); ::MessageBox((HWND)lparam,pDlg->GetError(GetLastError()),_T("错误"),MB_ICONHAND|MB_OK); return-1; } if(!sockSrvr.Listen())//监听 { pDlg->TransfersFailed(); ::MessageBox((HWND)lparam,pDlg->GetError(GetLastError()),_T("错误"),MB_ICONHAND|MB_OK); return-1; } //接收套接字已经创建向主对话框发送自定义消息,该消息发送一个消息给发送方,可以开始传数据 pDlg->SendMessage(WM_ACCEPT_TRANSFERS); CSocketrecSo; if(!sockSrvr.Accept(recSo)) { ::MessageBox((HWND)lparam,pDlg->GetError(GetLastError()),_T("错误"),MB_ICONHAND|MB_OK); return-1; } sockSrvr.Close(); //调用主对话框类中的ReceiveFile成员函数进行文件的接受pDlg->ReceiveFile(recSo); return0;}_SendThread基于TCP的文件传输程序全文共33页,当前为第15页。UINT_SendThread(LPVOIDlparam)基于TCP的文件传输程序全文共33页,当前为第15页。{ CSendFileDlg*pDlg=(CSendFileDlg*)lparam; //创建套接字 CSocketsockClient; if(!sockClient.Create()) { pDlg->TransfersFailed(); ::MessageBox((HWND)lparam,pDlg->GetError(GetLastError()),_T("错误"),MB_ICONHAND|MB_OK); return-1; } CStringstrIPAddress; UINTnPort; //获取对方地址 pDlg->m_psockClient->GetPeerName(strIPAddress,nPort); //连接服务器 if(!sockClient.Connect(strIPAddress,pDlg->m_wPort+PORT)) { pDlg->TransfersFailed(); ::MessageBox((HWND)lparam,pDlg->GetError(GetLastError()),_T("错误"),MB_ICONHAND|MB_OK); return-1; } //调用主对话框类进行文件发送 pDlg->SendFile(sockClient); return0;}3、在文件传输前,提前让对方了解文件信息,以便对方判断是否接受文件。 由于本工程实现了“文件传输与两端消息响应”的明确划分,该功能实现相当简单,只需要在发送端SelectFile之后向接收端发送一个“准备发送”的消息(该消息由于CMessage的封装,包含了文件的基本消息),该消息被接收后弹出对话框,由接收方来选择是否接受。基于TCP的文件传输程序全文共33页,当前为第16页。 接收端由接收方选择对话框选项,根据MessageBox返回值IDOK或是IDCANCLE,若为IDOK,则发送一个Accpet消息给发送方,否则发送一个REFUSE回去,均由发送方的OnReceive虚函数处理,大致过程如下:基于TCP的文件传输程序全文共33页,当前为第16页。 七、设计结果 1、服务器客户端的选择(服务器客户端集成)基于TCP的文件传输程序全文共33页,当前为第17页。 基于TCP的文件传输程序全文共33页,当前为第17页。说明:根据每个进程实例的用户选择RadioBox来更改界面外观初始默认服务器:InitDialog时设置按钮文本及调用gethostname获取本机IPv4地址及设置端口号 根据用户选择响应RadioBox消息,若为客户端,则更改界面外观,同时内部变量“m_bIsCilent”设置为TRUE(默认为FALSE),便于程序的后续工作2、简单的文件传输及简单的传输控制基于TCP的文件传输程序全文共33页,当前为第18页。基于TCP的文件传输程序全文共33页,当前为第18页。说明: 文件的发送专门由两个线程完成,线程中创建用于文件传输的套接字,而文件的传输控制则由主界面响应消息来完成,分工明确3、设计思考题的回答①套接字有基于阻塞和非阻塞的工作方式,试问你编写的程序是基于阻塞还是非阻塞的?各有什么优缺点?答:本程序文件传输基于阻塞、传递文件控制消息基于非阻塞。阻塞传输具有稳定性好,代码逻辑简单,编写程序方便的优点,但是阻塞传输效率低非阻塞传输相对应的效率较高,但是编写程序较为复杂,传输也更难控制②如何将上述通信改为非阻塞,避免阻塞?答:在源代码采用Send发送文件和Receive来接收文件的基础上,改用OnReceive和OnSend来响应文件发送和接收消息,结合MFC的CasyncSocket异步非阻塞套接字类来编程③在传输前能否先将要传输的文件的相关属性现行报告给对方,以便对方判断是否接受该文件的传输?答:由于本工程实现了“文件传输与两端消息响应”的明确划分,该功能实现相当简单,只需要在发送端SelectFile之后向接收端发送一个“准备发送”的消息(该消息由于CMessage的封装,包含了文件的基本消息),该消息被接收后弹出对话框,由接收方来选择是否接受。基于TCP的文件传输程序全文共33页,当前为第19页。基于TCP的文件传输程序全文共33页,当前为第19页。八、软件使用说明打开一个进程实例后,一端选择服务器(默认为服务器),软件会自动调用库函数获取本机IPv4地址以及自动设置端口号,点击【启动】按钮开始监听客户端的接入客户端打开软件后,点选【客户端】,此时IP地址控件置空,用户输入正在监听的客户端的IP地址,必要时输入对应的端口号,点选【连接】,开始申请连接服务器。连接选项设有超时器,超时会提示连接超时,成功后两端建立连接。连接成功后,两端的【选择文件】按钮点亮,可以选择文件发送。点击【选择文件】后弹出文件选择对话框,发送方成功选择文件,点击【确定】。此时启动发送超时器,超时显示超时。若成功,接收方弹出文件保存对话框,接收方选择好接收目录后点击【确定】,文件传输正式开始。传输开始后,双方【停止传输】【取消】点亮,双发可以通过点选这两个按钮来进行传输控制。传输失败会提示失败消息。九、参考资料 [1]zhuyf87.TCP三次握手.博客园博客,2012. [2]高传善,毛迪林,曹袖.计算机网络教程.高等教育出版社,2008. [3]孙鑫.VC++深入详解.电子工业出版社,2006.十、验收时间及验收情况验收时间:2016.12.29验收情况:演示了文件传输的程序,从建立连接单选择文件再到传输文件,到终止传输,没有出现问题。①通信方式是阻塞还是非阻塞的?答:本程序使用了两对套接字,一对工作于阻塞方式,用于传输文件,由于阻塞,故开辟了线程供其传输,一对工作于非阻塞方式,通过响应来实现客户端服务器的消息控制。②客户端服务器建立连接的过程? 答:使用MFC的CSocket类简化C/S连接:服务器Create()创建监听套接字,Listen()开始监听;服务器创建一个连接套接字,Connect()请求服务器连接,服务器OnAccept响应,并使用另外创建的套接字开始与客户端通信。③程序的鲁棒性怎么样?基于TCP的文件传输程序全文共33页,当前为第20页。 答:程序在创建套接字,连接服务器等操作时用了比较多的错误检测与提示,比如在套接字创建过程:对Create()的返回值进行分析,如果是0则代表创建失败,立即调用GetLastError()分析错误原因,并使用MessageBox弹出提醒用户。基于TCP的文件传输程序全文共33页,当前为第20页。另外也使用了TRY…CATCH块,增强程序的错误检测和恢复能力。十一、设计体会1、之前写的程序大多都是“单机”的,这次工程的实践让我更加深入地了解了互联网程序的编写,认识了Socket套接字的使用。2、通过编写程序,在应用层面理解了TCP的“三次握手”,深切体会到了基于TCP连接的传输稳定性。3、在设计时遇到了阻塞和非阻塞的选择,好在工程实现的时候,由于微软对Win_Sock的封装,结合CSocket、CSocketFile、CArchive三个类的使用,很好地简化了两端的通信问题,从而可以放心地把传输数据作为阻塞方式放到新开的线程中。4、在工程初步完成的时候,把程序放到两台不处于一个局域网内的机子上,发现不能连接。通过课本的翻阅和网上资料的查询,了解了NAT以及NAT穿越技术,知道了许多基于互联网的技术都需要用到“NAT穿孔”。5、文件传输涉及到了很多的异常处理,在之前编写的大部分程序要么没有异常处理,要么单纯地使用ifelse解决,在本次工程中用到了一些TRYCATCH块,体会到了异常处理机制的重要性。基于TCP的文件传输程序全文共33页,当前为第21页。基于TCP的文件传输程序全文共33页,当前为第21页。路由器配置实验一、实验目的1.认识路由器的端口、型号2.掌握路由器的路由配置3.理解网络互联的基本原理二、实验环境与设备本实验在PC机上利用模拟软件PacketTracerV6进行操作。三、实验内容1.路由器接口的配置2.静态路由配置3.默认路由配置4.动态路由配置本次实验的主要任务是了解路由器的基本设置,和网络之间的连接关系。通过这次的实验很好的掌握了各个网段之间的,各个路由器下的pc的连接情况。通过对静态,默认,动态路由配置,使得各个路由器下的PC相互通信。四、实验步骤1、路由器接口的配置创建拓扑结构图:基于TCP的文件传输程序全文共33页,当前为第22页。(1)为主机PC0,PC1,PC2配置IP地址、子网掩码和默认网关。基于TCP的文件传输程序全文共33页,当前为第22页。配置情况如下:IP地址和子网掩码的配置:(2)为路由器的各个接口分配IP地址和子网掩码,交换机不用配置。基于TCP的文件传输程序全文共3基于TCP的文件传输程序全文共33页,当前为第23页。配置方法入下:WAN口配置:基于TCP的文件传输程序全文共33页,当前为第24页。基于TCP的文件传输程序全文共33页,当前为第24页。(3)查看路由器的路由表使用命令:showiproute显示路由表中的路由信息。保存此时路由器显示的路由信息,以便与后面的实验结果进行比较。(C表示直连路由)Router0的路由表:Router1的路由表Router2的路由表基于TCP的文件传输程序全文共33页,当前为第25页。基于TCP的文件传输程序全文共33页,当前为第25页。(4)测试主机之间的连通性PC0与PC2的连通性:可以看到PC0ping不到PC2,可见PC0是不知道PC2的网段的PC1与PC2的连通性:根据网关发回的消息,同样PC1是ping不到PC2的2.配置静态路由(1)在Router0中添加一条到网络的静态路由,命令如下:Router(config)#iproute(2)再去查看Router0路由表,与步骤(2)中的路由表进行对比,观察路由表的变化情况。基于TCP的文件传输程序全文共33页,当前为第26页。可以看到,路由器0多了一条S的路由信息,之后有目的为该IP的包到达路由器,路由器就能根据路由表做出路由。基于TCP的文件传输程序全文共33页,当前为第26页。(3)在Router2中添加一条到网络的路由后,路由表如下:Router(config)#iproute同样,路由器1也增加了一条路由信息(4)测试PC0与PC2的连通性PC0与PC2的连通性如下图:可以看到,添加静态路由后PC0与PC2接通(5)在Router1和Router2中各添加一条静态路由,以实现PC1与PC2的互通。路由器1增加静态路由:路由器2增加静态路

温馨提示

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

评论

0/150

提交评论