文件传输程序设计_第1页
文件传输程序设计_第2页
文件传输程序设计_第3页
文件传输程序设计_第4页
文件传输程序设计_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

Internet网络程序设计试验汇报基于Socket的文献传播程序设计姓名:莫敌班级:软件0904学号:U17895指导老师:陆永忠.03.31目录1 试验目的及规定 21.1 试验目的 21.2 试验规定 22 试验环境 33 试验程序设计 33.1 设计思想 33.2 程序设计流程框图 43.3 详细设计 53.3.1 界面设计 53.3.2 重要功能实现 63.4 运行成果 94 试验感想 11试验目的及规定试验目的熟悉Socket的通讯机制,理解网络程序的设计措施。重点掌握基于TCP协议的Socket网络编程。试验规定设计界面,在服务器端和客户端传播图片和文献。假如是图片请显示该图片,假如是其他文献,则保留。试验环境编译环境:Windows7+VisualStudio使用MFC编写。运行环境:Windows7操作系统。试验程序设计设计思想根据试验的规定:在服务器和客户端之间传播文献和图片,则需要程序提供一种可靠的网络传播服务来保证文献在传播过程中无丢失、损坏。在分析了传播层协议TCP协议和UDP协议后,理解到TCP协议提供的是一种面向连接的、可靠的字节流服务,而UDP协议提供的是一种无连接的、不可靠的数据报服务。由于程序的需求,即必须保证文献传播的可靠性,于是,我采用基于TCP协议的Windowssockets来设计实现本试验。程序设计流程框图创立新的通信端点创立新的通信端点将一种当地地址关联到套接字上宣布接受连接,给出监听队列大小阻塞,直到有客户企图连接发送/接受数据释放连接结束开始积极尝试建立一种连接创立新的通信端点发送/接受数据释放连接结束开始服务器端客户端图1程序设计流程框图详细设计基于TCP的socket编程流程:服务器端:创立套接字(socket)。将套接字绑定到一种当地地址和端口上(bind)。将套接字设为监听模式,准备接受客户端祈求(listen)。等待客户端祈求到来。当祈求到来后,接受连接祈求,返回一种新的对应于本次连接的套件字(accept)。用返回的套接字和客户端进行通信(send/recv)。返回,等待另一客户端祈求。关闭套接字。客户端:创立套接字(socket)。向服务器发出连接祈求(connect)。和服务器端进行通信(send/recv)。关闭套接字。界面设计图2程序界面由于程序实现的功能单一简朴,因此我的程序界面设计如图2所示。程序由两个顾客可操作的控件构成:IP地址控件,顾客输入将要接受文献的接受方IP地址;“发送文献”按钮,单击选择顾客要发送的文献并发送所选文献数据。重要功能实现套接字库加载:AfxSocketInit()接受线程:UINTRecvProc(LPVOIDpParam){ while(TRUE) { CSockettmpSock; CSocketservSock; tmpSock.Create(5000); tmpSock.Listen(1); tmpSock.Accept(servSock); charfileNameRecv[500]={0}; inta=servSock.Receive(fileNameRecv,500); CFileDialogsaveDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "所有文献(*.*)|*.*||"); saveDlg.m_ofn.lpstrFile=fileNameRecv; if(IDOK==saveDlg.DoModal()) { CFilerecvFile; CStringrecvPathName; recvPathName=saveDlg.GetPathName(); recvFile.Open(recvPathName,CFile::modeCreate|CFile::modeWrite); UINTuiLength; servSock.Receive(&uiLength,4); intiBufSize=1024*5; intiSize=iBufSize; LPBYTEpBuf=newBYTE[iBufSize]; intiNumByte; UINTuiTotal=0; while(uiTotal<uiLength) { if((int)(uiLength-uiTotal)<iBufSize) { iSize=uiLength-uiTotal; } intiCount=0; while(iCount<iSize) { iNumByte=servSock.Receive(pBuf,iSize-iCount); iCount+=iNumByte; recvFile.Write(pBuf,iNumByte); } uiTotal+=iCount; } recvFile.Close(); servSock.Close(); charext[10]; CStringtmpExt; _splitpath(recvPathName,NULL,NULL,NULL,ext); tmpExt=ext; if(".bmp"==tmpExt||".pcx"==tmpExt||".tiff"==tmpExt||".gif"==tmpExt||".jpg"==tmpExt||".jpeg"==tmpExt||".tga"==tmpExt||".exif"==tmpExt||".fpx"==tmpExt) { ShellExecute(NULL,"open",recvPathName,NULL,NULL,SW_SHOWNORMAL); } } } return0;}发送文献按钮:voidCmyFileTransferDlg::OnBnClickedBtnSend(){ CFileDialogopenDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "所有文献(*.*)|*.*||"); if(IDOK==openDlg.DoModal()) { CStringopenFileName; openFileName=openDlg.GetFileName(); CSocketsendSock; sendSock.Create(); CStringIPstr; this->GetDlgItem(IDC_IPADDRESS1)->GetWindowText(IPstr); if(sendSock.Connect(IPstr,5000)==0) { return; } CFilesendFile; sendFile.Open(openDlg.GetPathName(),CFile::modeRead); sendSock.Send(openFileName,500); UINTuiLength; uiLength=sendFile.GetLength(); sendSock.Send(&uiLength,4); intiBufSize=1024*5; intiSize=iBufSize; LPBYTEpBuf=newBYTE[iBufSize]; intiNumByte; UINTuiTotal=0; while(uiTotal<uiLength) { if((int)(uiLength-uiTotal)<iBufSize) { iSize=uiLength-uiTotal; } iSize=sendFile.Read(pBuf,iSize); intiCount=0; while(iCount<iSize) { iNumByte=sendSock.Send(pBuf,iSize-iCount); iCount+=iNumByte; if(iCount<iSize) { sendFile.Seek(iSize-iCount,CFile::current); } } uiTotal+=iCount; } sendFile.Close(); sendSock.Close(); }运行成果阐明:为了便于测试和观测,选择127.0.0.1的发送IP地址进行单机测试。图3程序运行启动界面双击打开myFileTransfer.exe可执行程序后的程序启动界面如图3所示,然后在“对方IP地址”栏中输入当地回送地址127.0.0.1准备进行发送文献。图4发送文献选择界面单击“发送文献”按钮后,弹出如图4所示的文献选择界面,选择要发送的文献并单击“打开”按键,确定选择并将所选文献发送给接受方。图5接受方接受到文献当接受方接受到发送方传来的文献时,接受方程序弹出如图5所示的“保留”界面,提醒顾客接受文献成功并进行保留。图6接受图片自动显示当接受方接受的文献为图片时,程序调用操作系统默认的图片浏览器自动打开浏览接受到的图片。当接受的是非图片文献时,程序则只是保留该文献,而不自动打开。试验感想通过独立完毕了这次试验的所有内容,我对网络编程有了更全面、深刻地认识和理解,尤其是对Windowssocket的掌握和编程应用。由于我对MFC较为熟悉,因此在整个试验过程中,我采用MFC进行编程来实现这个传播文献的程序。在程序实现之前,我通过网络上的基于socket网络编程资料和老师课上讲解的内容,认真全面地学习了Windowssocket的运行机制和其在网络编程上的应用措施。在设计实现阶段,我最先使用的是基础SOCKET类,但在通信双方传送文献的基本信息的详细实现时,碰到了不少的麻烦。例如SOCKET类中的send措施的第二个参数类型是“constchar*”用来指明一种寄存将要发送数据的缓冲区,但在传文献信息长度int类型等非char*的变量时转化很麻烦。于是,我查看MSDN文档理解到MFC已为开发者封装了一种很简便的CSOCKET类。应用CSOCKET类能很以便轻易地处理上面的问题,并且实现网络通信的流程也很清晰,最终我采用MFC封装的CSOCKET类编码实现的这次试验内容。在接受图片自动显示的问题上,我试验了两种实现方式:用一种MFC中的承托图片控件来显示和调用操作系

温馨提示

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

评论

0/150

提交评论