基于TCP的文件传输程序.doc
《基于TCP的文件传输程序.doc》由会员分享,可在线阅读,更多相关《基于TCP的文件传输程序.doc(16页珍藏版)》请在咨信网上搜索。
1、计算机网络系统实践报告设计题目:网络文件传输学生姓名:郑波学 号:2013211644专业班级:计算机科学与技术13-2班2015年12月一、 设计要求1、 实现单线程文件传输功能2、 在以上的基础上,掌握多线程技术,在文件网络传输时,可选择单线程或多线程3、 加入异常控制机制,增强程序的鲁棒性(Robust)4、 了解如何提高套接字传输的速率,以及如何加强传输的稳定性二、开发环境与工具Windows7下Microsoft Visual Stuio三、设计原理1、网络传输协议TCP/IP协议栈中的两个协议:TCP(Transmission Control Protocol):传输控制协议UDP
2、(User Datagrm Protocal):用户数据报协议TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。该连接一旦建立,两台计算机之间就可以把数据当做一个双向字节流进行交换。UDP是无连接的通信协议,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接受发自若干个源的数据.就是说,如果一个主机向另外一台主机发送数据,这个数据就会立即发出,而不管另外一台主机是否已准备接收数据。如果另外一台主机接收到了数据,它不会确认收到与否。本次工程目的是传输文件,显然需要用TCP建立连接,而TCP连接需要“三次
3、握手。2、三次握手 三次握手具体过程:1、客户端主动与服务器联系,TCP首部控制位中的SYN设置为1,发送带有SYN的TCP段,并把初始序号告诉对方2、服务端收到带有SYN的报文,记录客户端的初始序号,选择自己的初始序号,设置控制位中的SYN和ACK。因为SYN占用一个序号,所以确认序号设置为客户端的初始序号加1,对客户端的SYN进行确认3、服务端的报文到达客户端,客户端设置ACK控制位,并把确认好设为服务器的初始序号加1,以确认服务器的SYN报文段,这个报文只是确认消息,告诉服务器已经成功建立了连接四、系统功能描述及软件模块划分1、系统功能描述 软件实现了点对点的文件传输。传输前的接收提醒以
4、及传输过程中的控制. 2、软件模块划分 本程序可以划分成以上三个模块:传输控制模块,文件传输模块和服务连接模块。其中:服务连接模块用来建立客户端到服务器的连接 文件传输模块主要用两个线程:_SendThread和_ListenThread来完成,实现发送和接收文件的功能。传输控制模块主要通过封装好的可串行化信息类CMessage互相传递两端的文件操作消息,响应“暂停传输”,“关闭连接”等功能五、设计步骤 1、服务连接模块 先要建立起客户端与服务器之间的连接,大致过程如下: 服务器启动: if(m_nServerType = SERVER)/创建服务器套接字m_psockServer = new
5、 CListenSocket(this);if(!m_psockServerCreate(m_wPort)) /绑定端口delete m_psockServer;m_psockServer = NULL;MessageBox(GetError(GetLastError(), _T(”错误”), MB_ICONHAND);return ;/开启线程,监听客户端连接if(!m_psockServer-Listen() delete m_psockServer;m_psockServer = NULL;MessageBox(GetError(GetLastError(), _T(”错误), MB_I
6、CONHAND);return ; 客户端填入相应的IP地址,连接服务器if((CIPAddressCtrl)GetDlgItem(IDC_IPADDRESS)-IsBlank()MessageBox(”IP 地址不能为空, 错误”, MB_ICONHAND);return ;/创建客户端套接字m_psockClient = new CClientSocket(this);if(!m_psockClientCreate()delete m_psockClient;m_psockClient = NULL;MessageBox(GetError(GetLastError(), _T(错误”),
7、MB_ICONHAND);return ;/与服务器建立连接CString strIPAddress;GetDlgItem(IDC_IPADDRESS)GetWindowText(strIPAddress);if(!m_psockClient-Connect(strIPAddress, m_wPort) /Connect连接服务器,服务器用OnAccept响应delete m_psockClient;m_psockClient = NULL;MessageBox(GetError(GetLastError(), _T(”错误”), MB_ICONHAND);return ;/初始化客户端套接字
8、m_psockClientInit(); 服务器响应CClientSocket pSocket=new CClientSocket(this);/接收请求后获得新的套接字,交由新的套接字处理请求if(m_psockServerAccept(pSocket)) /非零则接收连接请求成功/初始化Accpet返回的套接字pSocketInit();CMessage pMsg;/检测套接字是否为空,空则还没有连接任何客户端if(m_psockClient=NULL)pMsg=new CMessage(CONNECT_BE_ACCEPT); pSocket-SendMsg(pMsg);/发回“这边可以连
9、接”消息回去,客户端的Receive接收m_psockClient=pSocket; /若为服务器,则之前未初始化,可保存这个套接字,用来跟客户端交互GetDlgItem(IDC_SELECT_FILE)-EnableWindow(TRUE);else pMsg=new CMessage(CONNECT_BE_REFUSE);pSocketSendMsg(pMsg); 客户端收到连接成功消息if(pMsgm_nType=CONNECT_BE_ACCEPT)GetDlgItem(IDC_SELECT_FILE)EnableWindow(TRUE);return;2、传输控制模块该工程用了两对套接
10、字,一对用来接收传输控制消息,一对用来收发文件。我们这个模块用的是第一对在MFC中定义了一个在套接字编程中使用的CSocketFile类,可以充分发挥CSocket类的特性。CSocketFile类是CFile的派生类,主要用来在Windows Sockets编程中发送和接收序列化数据(如结构体数据).通过把CSocketFile类对象、CArchive对象和CSocket创建的套接字对象联系起来,可以实现数据的加载(接收)和存储(发送)。 MFC集成CSocketFile、CSocket、CArchive可以简化网络传输。下图可以直观地反应这三者是如何结合来在客户端和服务器之间传输消息的 先
11、来看看服务器和客户端的套接字初始化工作:m_pFile = new CSocketFile(this);m_pArchiveIn = new CArchive(m_pFile,CArchive::load);m_pArchiveOut = new CArchive(m_pFile,CArchive::store); 这样一来,当使用m_pArchiveIn对象来调用可串行化消息类CMessage的Serialize时,接收方就能响应OnReceive消息,来完成控制信息的传递。 本工程在主类CsendFileDlg中定义了传输的三种状态:m_bIsWait:已连接,正在等待传输文件m_bIsT
12、ransmitting: 正在传输文件m_bIsStop:传输已终止本工程定义的可串行化消息类CMessage,用来传递文件名m_strFileName、文件长度m_dwFileSize以及当前的传输状态m_nType,大致流程如下图:其中,我在建工程的时候,把客户端和服务器集成在了一个界面OnReceive就用来接收两方的消息,关键代码如下:CMessage pMsg=new CMessage();pSocketReceiveMsg(pMsg);if(pMsgm_nType=CONNECT_BE_ACCEPT)GetDlgItem(IDC_SELECT_FILE)EnableWindow(T
13、RUE);return;if(pMsg-m_nType=CONNECT_BE_REFUSE)MessageBox(_T(”服务器正在和另外的客户端连接,稍等),_T(”错误”), MB_ICONHAND);delete m_psockClient;m_psockClient=NULL;return ;if (pMsgm_nType=DISCONNECT) MessageBox(_T(对方已经关闭”), _T(警告”), MB_ICONHAND);if(m_psockClient != NULL)delete m_psockClient;m_psockClient = NULL;/接收请求if(
14、pMsgm_nType=REQUEST)m_bIsWait=TRUE; /忙状态置1m_strFileName=pMsgm_strFileName;m_dwFileSize=pMsg-m_dwFileSize;CString strName,strSize;strName。Format(”文件名:%s”,m_strFileName);strSize。Format(文件大小:%ld字节”,strSize);/这里完成了发送文件前给对方提示的功能if(MessageBox(strName+”rn+strSize,对方请求向你发送文件”,MB_OKCANCEL)=IDCANCEL)CMessage*
15、 pMsg = new CMessage(REFUSE);m_psockClient-SendMsg(pMsg);return;CFileDialog dlg(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)M
16、essageBox(_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)/告诉对方文件发送请求被拒绝 CMessage pMsg = new C
17、Message(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=FA
18、LSE;MessageBox(_T(请求被拒绝”), _T(警告”), MB_ICONEXCLAMATION);return ;/当对方取消文件传输时执行该if语句里面的内容if(pMsg-m_nType = CANCEL)m_bIsWait = FALSE;return ; 3、文件传输模块两个线程:_ListenThread():建立新的监听套接字,准备接收文件_SendThread(): 建立客户端套接字,连接监听套接字,发送文件 当两方建立了可靠的连接,一方选择文件后,就会使用传输控制模块给对方发送文件发送请求,对方的ProcessReceive接收到后查看当前的消息状态,(上个模块的
19、OnReceive已经写得很清楚),同意接受后,开启文件接收线程,同时给发送方返回一个准备完成状态,于是,发送方开启文件发送线程,最后完成文件的传输工作,同时置状态m_bIsStop为TRUE,便于双方传输控制 发送线程关键函数SendFilevoid CSendFileDlg:SendFile(CSocket senSo)m_bIsTransmitting=TRUE; CFile file;if (!file。Open(m_strPath,CFile:modeReadCFile::typeBinary))AfxMessageBox(_T(文件打开失败);senSo.Close();retur
20、n ;m_ctrlProgress.SetRange32(0,m_dwFileSize);int nSize=0,nLen=0;DWORD dwCount = 0;char bufBLOCKSIZE=0;file。Seek(0,CFile::begin);/开始传送while(1)/每次读取BLOCKSIZE大小nLen=file.Read(buf,BLOCKSIZE);if(nLen=0)break;/发送文件内容nSize=senSo。Send(buf,nLen);dwCount+=nSize;m_ctrlProgress.SetPos(dwCount);CString strTransf
21、ersSize;strTransfersSize。Format(%ld 字节,dwCount);/设置进度条属性GetDlgItem(IDC_RECEIVE_SIZE)-SetWindowText(strTransfersSize);int p=((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。Cl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 TCP 文件传输 程序
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。