文件传输程序设计
计算机网络课程设计(文件传输)

能可靠工作的文件传输工具1 理论知识(一级标题,黑体四号,加粗,单倍行距,段前后6磅)1.1 传输文件工具工作原理分析(二级标题,宋体四号,加粗,单倍行距,段前后6磅)程序使用的是基于TCP/IP的协议,用套接字来实现文件的传输。
1.1.1 TCP/IP的网络体系结构TCP/IP协议采用层次体系结构,如图2所示,从图中可以看出,每一层在逻辑上都与通信端的对应层相连接。
图中所示的服务器程序持续监听通信客户端;客户端仅周期性地与服务器相连接以交换数据,其中TCP协议层提供相当于OSI参考模型中传输层的服务,为收、发端应用程序提供通信;IP协议层负责提供统一的数据报;链路层主要功能是收、发IP层的IP数据报;TCP/IP之上是该协议提供的各种服务,而底层网络可以是不同的物理网络,如Ethernet、Token Ring、X.25公共分组交换网等。
图1 TCP/IP协议层模型(LAN)1.1.2 套接字(Sockets)套接字(Sockets)最早是由Berkeley大学提出在UNIX操作系统下实现TCP/IP通信协议的开发接口,随着Internet在全球范围内的广泛使用,Sockets已成为网络编程的通用接口。
Microsoft 公司以Sockets为基础开发的Winsock建立了Windows环境下网络间的编程接口。
套接字是对网络中不同主机上应用进程之间进行双向通信的端点的抽象,一个套接口就是网络上进程通信的一端,提供了应用层进程利用网络协议栈交换数据的机制。
套接字可以分为流式套接字(Stream Sockets)、数据报套接字(Datagram Sockets)和原始套接字(Raw Sockets)。
流式套接字最常用的套接字,提供面向连接的、无差错的、发送顺序一致的、包长度不限和非重复的网络信息的传输;数据报套接字提供无连接的服务,以独立的数据报进行传输,不保证顺序性、可靠性和无重复性;原始套接字提供对下层网络的通信协议的访问,主要用于开发新的协议或用于提取较隐蔽的功能。
中南大学计算机网络课程设计 文件传输程序要点

第三章文件传输程序3.1设计要求包括客户端和服务器程序,应实现以下功能:(1)客户端既能上传文件到服务器,也能从服务器下载文件;(2)在客户端上可显示文件基本信息和传输状态信息,可浏览服务器上供下载的文件列表,选择某文件下载到本地某目录下;(3)服务器端能接收客户端上传的文件,并保存在某一目录下;也能响应客户端的文件浏览与下载请求;(4)增加其它附加创新功能。
程序应具有图形化界面,美观友好。
3.2设计思想随着计算机网络的迅速发展,人们的生活越来越离不开网络,如今网络编程已成为计算机发展的热点,而在众多的网络通信中,又以TCP/IP协议最为流行。
本文讨论的Winsock控件,提供了访问TCP/IP网络的捷径,使用它可以不必了解TCP/IP的细节和调用Winsock API,只要设置好相应的属性和触发事件后的处理,就可以实现计算机之间的数据通信。
一、Winsock控件Winsock即Windows Sockets规范的简称,是目前最流行的网络通信应用程序接口之一。
所谓Socket,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
应用程序通常通过“套接字”向网络发出请求或者应答网络请求。
Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。
Winsock控件工作在传输层上,在这一层上,目前主要流行的协议包括TCP和UDP两种:TCP 协议适用于那些对于数据的可靠性要求比较高的情况,目前大多数的网络应用层协议都是基于TCP协议的(例如常用的HTTP、FTP、SMTP、POP3等协议);UDP 协议适用于对数据可靠性要求不高而对速度要求较高的情况,这里主要包括一些需要大流量的(例如Real公司的RTSP协议,腾讯公司的QQ协议等)。
二、Winsock控件通信的工作原理Winsock控件是基于Socket规范创建的,所以其通信的实质是对Socket接口进行数据的读写操作。
C++实现文件传输

c++实现文件传输之一:框架结构和界面实现在木马中文件管理的重要性,是无需质疑的,对于文件的管理,做到并不难,但做好却也不易在我们编写一个功能完整的“文件木马”其实现效果如图所示。
为了文章的完整性,我们将分为数篇来介绍,本文主要介绍程序的整体框架和界面实现,在以后的文章中将以此框架为基础实现详细的功能。
实现:枚举磁盘,枚举目录,获取文件信息上传文件,下载文件,执行文件,创建目录,删除目录等传输控制结构要实现客户端与服务端的通信,设计一个合理的传输控制结构,会使后面的工作轻松很多,为了使代码易读首先对要使用的命令进行预定义其各个命令定义如下#define GetDriver 0x01 //磁盘信息#define GetDirInfo 0x02 //目录信息#define ExecFile 0x03 //执行文件#define GetFile 0x04 //下载文件#define PutFile 0x05 //上传文件#define DelFile 0x06 //删除文件#define DelDir 0x07 //删除目录#define CreateDir 0x08 //创建目录#define FileInfo 0x09 //文件信息#define GetScreen 0x10 //查看屏幕在程序的网络通信中主要有操作命令 ,命令对像,和具体数据三部分,对于命令的传输定义如下结构typedef struct{int ID; //操作命令BYTE lparam[BUF_LEN*2]; //命令对像}COMMAND;因为在程序中打交道最多的就是文件,对文件的详细属性定义如下结构typedef struct{char FileName[MAX_PATH]; //文件名称int FileLen; //文件长度char Time[50]; //时间信息BOOL IsDir; //为目录否BOOL Error; //错误信息HICON hIcon; //图标句柄}FILEINFO;服务端结构服务端还是比较简单的其整体思路如下1.服务端循环接受连接,并把连接交给线程处理2.线程接受"命令数据",并跟据命令ID将命令对像和SOCKET句柄传给处理函数3.函数执行指定功能,并返回执行结果对整体结构的描述,我们用伪代码表述如下main(){ /*初示化设置......*/while(true){if(client=accept(server,(sockaddr *)&clientaddr,&len))//循环接受连接{CreateThread(NULL,NULL,SLisen,(LPVOID)client,NULL,NULL);//传递线程处理}}/*清理释放资源......*/WSACleanup();}服务端程序运行后循环接受连接,如果有新的连接就传递给新的线程处理,线程代码如下DWORD WINAPI SLisen(LPVOID lparam){SOCKET client=(SOCKET)lparam;COMMAND command;while(1){if(recv(client,(char*)&command,sizeof(command),0)==SOCKET_ERROR)//接受命令数据{cout<<"The Clinet Socket is Closed/n";break;}else{switch(command.ID)//判断命令ID{case GetDriver://将命令对像和SOCKET句柄传递给处理函数GetDriverProc (command,client);break;case DelFile:DelFileProc (command,client);break;/*其它命令......*/}}}}线程式的功能是接受客户端的"命令数据",并跟跟据命令ID 将命令对像传递给处理函数,由函数完成指定的功能以删除文件命令为例其函数格式如下DWORD DelFileProc (COMMAND command,SOCKET client){if(DeleteFile((char*)command.lparam)==0)//command.lparam为命令对像,这里为要删除的文件路径{send(client,"删除失败...");}else{send(client,"删除成功...");}}很容易看出,处理函数接受"命令对像"和客户端SOCKET句柄,执行后会把结果传递回去....客户端结构客户端结构的实现思路如下1.跟服务端建立连接2.发送用户命令3.启动一个线程,用于接受服务端的返回信息对整体结构的描述,我们用伪代码表述如下void CMyDlg::OnConnect(){if(connect(server,(SOCKADDR*)&serveraddr,sizeof(serveraddr))<0)//连接....{return ;}CreateThread(NULL,NULL,CLisen,this,NULL,NULL);//创建线程用于接受SERVER返回信息}对于用户发送的命令我们仍以删除文件为例说明其代码如下void CMyDlg::OnMenuDelFile(){HTREEITEM CurrentNode = m_tree.GetSelectedItem(); //取得选择的节点CString FullPath =GetFullPath(CurrentNode); //取得节点全目录COMMAND command;command.ID=DelFile; //设置命令为删除文件 //删除文件command.lparam=FullPath.LockBuffer()); //将路径加入命令对像send(server,command);}用于接受SERVER返回信息的线程,和服务端接受命令线程相似,这里就不再说明了,有兴趣可以看下源代码到这里程序的流程框架就介绍完了,下面我们再看一下程序的界面设置.界面实现程序的主界面如上图所示,主程序是一个对话框,主要包括一个树控件m_tree 和列表控件m_list分别用于显示磁盘目录和文件,在对话框初示化时用以下代码设置树控件的属性DWORD dwStyle = GetWindowLong(m_tree.m_hWnd,GWL_STYLE);dwStyle |=TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT; SetWindowLong(m_tree.m_hWnd,GWL_STYLE,dwStyle);对于列表框控件则没有太多要求,要留意的是,如果显示图标应该把Styles显示属性设置为ICONVC的做出的界面,常常让人有种摔键盘的冲动。
文件传输系统课程设计

文件传输系统课程设计一、课程目标知识目标:1. 理解文件传输系统的基本概念,掌握其工作原理;2. 学习并掌握常用的文件传输协议,如FTP、SFTP、FTPS等;3. 了解文件传输过程中的安全性和权限控制方法。
技能目标:1. 能够独立搭建简单的文件传输系统,并进行基本配置;2. 学会使用不同文件传输协议进行文件的上传和下载;3. 掌握对文件传输过程进行监控和管理的方法。
情感态度价值观目标:1. 培养学生对计算机网络知识的学习兴趣,增强其探究网络技术的欲望;2. 培养学生具备良好的网络素养,尊重知识产权,自觉抵制非法文件传输行为;3. 培养学生的团队协作精神,使其在合作中共同进步。
分析课程性质、学生特点和教学要求:1. 课程性质:本课程属于计算机网络技术领域,具有较强的理论性和实践性;2. 学生特点:学生具备一定的计算机网络基础知识,对实际操作有较高的兴趣;3. 教学要求:注重理论与实践相结合,强调学生动手能力,提高学生的实际应用能力。
二、教学内容1. 文件传输系统概述- 了解文件传输系统的基本概念和发展历程;- 学习文件传输系统的基本组成和功能。
2. 常用文件传输协议- FTP协议:学习FTP的工作原理、命令和应答;- SFTP协议:了解SFTP的安全特性,掌握SFTP的连接和操作方法;- FTPS协议:学习FTPS的加密机制,了解其在文件传输中的应用。
3. 文件传输安全与权限控制- 学习文件传输过程中的加密技术,如SSL/TLS;- 掌握基于用户身份验证的权限控制方法;- 了解常见文件传输安全问题和应对措施。
4. 文件传输系统的搭建与配置- 学习如何安装和配置文件服务器;- 掌握客户端连接文件服务器的操作方法;- 学习对文件传输系统进行监控和管理的方法。
5. 实践操作与案例分析- 搭建一个简单的文件传输系统,进行实际操作练习;- 分析典型的文件传输案例,了解实际应用场景;- 学习解决文件传输过程中可能遇到的问题。
文件传输课程设计

文件传输课程设计一、课程目标知识目标:1. 让学生理解文件传输的基本概念,掌握不同传输方式的优缺点;2. 使学生掌握使用常见文件传输软件和工具,如FTP、网盘等;3. 引导学生了解网络通信协议中与文件传输相关的内容。
技能目标:1. 培养学生能够独立选择合适的文件传输方式,并进行实际操作;2. 提高学生解决文件传输过程中遇到问题的能力;3. 培养学生具备一定的网络通信协议分析和配置能力。
情感态度价值观目标:1. 培养学生对网络技术的兴趣,激发他们探索新技术的热情;2. 引导学生树立正确的网络安全意识,遵守网络道德规范;3. 培养学生具备团队协作精神,善于与他人分享和交流。
课程性质:本课程为信息技术课程,旨在帮助学生掌握文件传输的相关知识和技能,提高他们在实际应用中解决问题的能力。
学生特点:考虑到学生所在年级,已具备一定的计算机操作基础和网络知识,对新鲜事物充满好奇,但可能对网络通信协议等较为抽象的概念理解困难。
教学要求:结合学生特点,课程设计应注重实践操作与理论知识的结合,以实例讲解和操作演示为主,注重启发式教学,引导学生主动探究和解决问题。
同时,关注学生的情感态度价值观培养,提高他们的综合素质。
通过分解课程目标为具体学习成果,为后续教学设计和评估提供依据。
二、教学内容1. 文件传输基本概念:介绍文件传输的定义、分类和常用传输方式;教材章节:第一章 网络基础知识 第三节 文件传输与网络应用2. 常见文件传输工具:讲解FTP、网盘等工具的使用方法和操作步骤;教材章节:第二章 网络应用实践 第四节 文件传输工具的使用3. 网络通信协议:分析TCP/IP协议中与文件传输相关的内容,如HTTP、FTP 协议;教材章节:第三章 网络通信协议 第二节 常用网络协议介绍4. 文件传输的安全与隐私:探讨如何确保文件传输过程中的安全性和保护用户隐私;教材章节:第四章 网络安全 第一节 文件传输的安全与隐私5. 实践操作:安排学生进行实际操作,包括FTP服务器搭建与访问、网盘的使用等;教材章节:第五章 实践操作 第二节 文件传输实践6. 案例分析与讨论:通过案例分析,使学生了解文件传输在实际应用中的问题及解决方法;教材章节:第六章 案例分析 第四节 文件传输案例分析教学内容安排和进度:第一课时:文件传输基本概念第二课时:常见文件传输工具的使用第三课时:网络通信协议与文件传输第四课时:文件传输的安全与隐私第五课时:实践操作及案例分析讨论三、教学方法1. 讲授法:对于文件传输的基本概念、网络通信协议等理论知识,采用讲授法进行教学。
c++文件传输毕业设计

c++文件传输毕业设计摘要:本文描述了一个基于C++的文件传输系统的设计与实现。
该系统具有高效和安全的特点,并且采用了TCP/IP协议进行数据传输。
系统分为客户端和服务器端,客户端可以将本地文件传输到服务器端,服务器端可以接收并保存文件。
在设计过程中,使用了文件流、套接字编程和多线程技术。
通过对系统进行测试和评估,验证了其稳定性和可靠性。
最终结果表明,该文件传输系统能够快速、安全地传输大文件,并且能够满足用户的需求。
1. 引言文件传输是计算机网络中常见的任务之一。
随着互联网的发展和普及,文件传输系统需要具备高效、安全、稳定和可靠等特点。
本文设计了一个基于C++的文件传输系统,该系统通过TCP/IP协议进行数据传输,能够满足用户的需求。
2. 系统设计2.1 系统结构文件传输系统分为客户端和服务器端两部分。
客户端提供了文件选择和传输功能,服务器端则负责接收和保存文件。
2.2 数据传输系统基于TCP/IP协议进行数据传输,使用套接字编程进行通信。
客户端通过套接字将文件内容划分为较小的数据块并发送给服务器端,服务器端再将接收到的数据块组合成完整的文件。
2.3 多线程技术为了提高系统的传输效率,使用了多线程技术。
客户端和服务器端均开启多个线程进行文件传输,从而实现并发传输。
3. 系统实现3.1 客户端实现客户端使用C++编写,通过用户界面提供文件选择的功能。
客户端接收用户选择的文件,并将文件内容划分为数据块进行传输。
客户端还可显示传输进度和传输结果。
3.2 服务器端实现服务器端使用C++编写,通过套接字接收客户端传输的数据块。
服务器端将接收到的数据块组合成完整的文件,并保存到本地磁盘中。
服务器端还可显示传输进度和传输结果。
4. 系统测试与评估为了验证系统的稳定性和可靠性,对系统进行了测试。
通过传输大文件和多个文件,评估系统的传输速度和传输成功率。
测试结果表明,系统能够快速、安全地传输大文件,并且具有良好的稳定性和可靠性。
基于VC 的Winsock 的文件传输程序的设计

基于VC 的Winsock 的文件传输程序的设计环境要求:Windows95/98/2000/XP功能要求:能将键盘上指定的文件发送到另一台计算机上;能将接收到的数据显示到屏幕窗口内,并显示收到文件的字节数和文件传输速率;一、设计目标用TC、Visual BASIC、Visual C++、Java 等编程工具和路由器、交换机、主机等网络设备提供的接口,解决网络用户之间的交互式对话问题,或计算通信网络的延迟、信道容量分配,或编码分析、通信协议分析,网络互连互通、网络规划。
进一步深入掌握网络设计和通信程序的设计原理。
使学生对计算机通信网络的设计实现有较深的了解,培养较高的通信网络设计能力。
本课设实验将基于2013版Visual Studio进行WINSOCK的文件传输的编程实现。
在WINDOWS95/98,WINDOWSNT进行WINSOCK开发使用的编程语言有很多,VC++,JAVA,DELPHI,VB等。
其中VC时使用最普遍,和WINSOCK结合最紧密的。
并且VC++对原来的WindowsSockets 库函数进行了一系列封装,继而产生了CAsynSocket、CSocket、CSocketFile等类,它们封装着有关Socket的各种功能,是编程变得更加简单。
SOCKET实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有SOCKET 接口的计算机通信。
应用程序在网络上传输,接收的信息都通过这个SOCKET接口来实现。
在应用开发中就像使用文件句柄一样,可以对SOCKET句柄进行读,写操作。
二、设计原理套接字(Socket) 是一种网络编程接口,它是对通信端点的一种抽象,提供了一种发送和接收数据的机制。
套接字有两种类型:流式套接字(St ream Socket s) 和数据报套接字(Datagram Socket s) 。
数据报套接字提供了一种不可靠的、非连接的数据包通信方式,它使用用户数据报协议(UDP) ;而流式套接字可以将数据按顺序无重复地发送到目的地,它提供的是一种可靠的面向连接的数据传输方式。
数据传送实验报告程序(3篇)

第1篇一、实验目的1. 理解数据传送的基本原理和过程。
2. 掌握数据传送的常用方法。
3. 学会使用数据传送工具进行实验操作。
4. 分析数据传送过程中的性能指标。
二、实验环境1. 操作系统:Windows 102. 软件环境:Python3.83. 硬件环境:计算机、网络设备三、实验内容1. 数据传送方法的选择2. 数据传送工具的使用3. 数据传送性能分析四、实验步骤1. 数据传送方法的选择(1)选择数据传送方法:本实验选择FTP(File Transfer Protocol)进行数据传送。
(2)分析FTP的特点:FTP是一种常用的数据传送方法,具有以下特点:a. 简单易用:FTP协议简单,易于实现;b. 传输速度快:FTP协议支持断点续传,传输速度快;c. 安全性较高:FTP支持加密传输,安全性较高。
2. 数据传送工具的使用(1)安装FTP服务器:在实验计算机上安装FTP服务器,例如:Serv-U。
(2)配置FTP服务器:配置FTP服务器,包括设置用户、权限、共享目录等。
(3)安装FTP客户端:在另一台计算机上安装FTP客户端,例如:FileZilla。
(4)连接FTP服务器:使用FTP客户端连接到FTP服务器。
(5)上传/下载文件:在FTP客户端选择要上传/下载的文件,然后点击上传/下载按钮。
3. 数据传送性能分析(1)传输速度:使用网络测试工具(如:Fluke Network)测试FTP服务器与客户端之间的传输速度。
(2)稳定性:观察数据传送过程中的连接稳定性,包括连接断开、重连等情况。
(3)安全性:使用安全测试工具(如:Wireshark)分析FTP数据传输过程中的安全性。
五、实验结果与分析1. 传输速度:根据测试结果,FTP数据传送的传输速度为10Mbps,满足实验要求。
2. 稳定性:在实验过程中,FTP连接稳定,未出现断开、重连等情况。
3. 安全性:通过Wireshark分析,FTP数据传输过程中使用了SSL加密,保证了数据传输的安全性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Internet网络程序设计实验报告基于Socket的文件传输程序设计姓名:莫敌班级:软件 0904学号:U200917895指导老师:陆永忠2012.03.31目录1 实验目的及要求 (3)1.1 实验目的 (3)1.2 实验要求 (3)2 实验环境 (3)3 实验程序设计 (3)3.1 设计思想 (3)3.2 程序设计流程框图 (4)3.3 详细设计 (5)3.3.1 界面设计 (5)3.3.2 主要功能实现 (6)3.4 运行结果 (9)4 实验感想 (11)1实验目的及要求1.1实验目的熟悉Socket的通讯机制,了解网络程序的设计方法。
重点掌握基于TCP协议的Socket 网络编程。
1.2实验要求设计界面,在服务器端和客户端传输图片和文件。
如果是图片请显示该图片,如果是其他文件,则保存。
2实验环境编译环境:Windows 7 + Visual Studio 2010 使用MFC编写。
运行环境:Windows 7操作系统。
3实验程序设计3.1设计思想根据实验的要求:在服务器和客户端之间传输文件和图片,则需要程序提供一种可靠的网络传输服务来保证文件在传输过程中无丢失、损坏。
在分析了传输层协议TCP协议和UDP 协议后,了解到TCP协议提供的是一种面向连接的、可靠的字节流服务,而UDP协议提供的是一种无连接的、不可靠的数据报服务。
由于程序的需求,即必须保证文件传输的可靠性,于是,我采用基于TCP协议的Windows sockets来设计实现本实验。
3.2程序设计流程框图图1程序设计流程框图3.3详细设计基于TCP的socket编程流程:服务器端:创建套接字(socket)。
将套接字绑定到一个本地地址和端口上(bind)。
将套接字设为监听模式,准备接收客户端请求(listen)。
等待客户端请求到来。
当请求到来后,接收连接请求,返回一个新的对应于此次连接的套件字(accept)。
用返回的套接字和客户端进行通信(send/recv)。
返回,等待另一客户端请求。
关闭套接字。
客户端:创建套接字(socket)。
向服务器发出连接请求(connect)。
和服务器端进行通信(send/recv)。
关闭套接字。
3.3.1界面设计图2程序界面由于程序实现的功能单一简单,所以我的程序界面设计如图2所示。
程序由两个用户可操作的控件组成:IP地址控件,用户输入将要接收文件的接收方IP 地址;“发送文件”按钮,单击选择用户要发送的文件并发送所选文件数据。
3.3.2主要功能实现套接字库加载:AfxSocketInit()接收线程:UINT RecvProc( LPVOID pParam ){while (TRUE){CSocket tmpSock;CSocket servSock;tmpSock.Create(5000);tmpSock.Listen(1);tmpSock.Accept(servSock);char fileNameRecv[500] = {0};int a = servSock.Receive(fileNameRecv, 500);CFileDialog saveDlg(FALSE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "所有文件(*.*)|*.*||");saveDlg.m_ofn.lpstrFile = fileNameRecv;if (IDOK == saveDlg.DoModal()){CFile recvFile;CString recvPathName;recvPathName = saveDlg.GetPathName();recvFile.Open(recvPathName, CFile::modeCreate | CFile::modeWrite);UINT uiLength;servSock.Receive(&uiLength, 4);int iBufSize = 1024 * 5;int iSize = iBufSize;LPBYTE pBuf = new BYTE[iBufSize];int iNumByte;UINT uiTotal = 0;while (uiTotal < uiLength){if ((int)(uiLength - uiTotal) < iBufSize){iSize = uiLength - uiTotal;}int iCount = 0;while (iCount < iSize){iNumByte = servSock.Receive(pBuf, iSize - iCount);iCount += iNumByte;recvFile.Write(pBuf, iNumByte);}uiTotal += iCount;}recvFile.Close();servSock.Close();char ext[10];CString tmpExt;_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);}}}return 0;}发送文件按钮:void CmyFileTransferDlg::OnBnClickedBtnSend(){CFileDialog openDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "所有文件(*.*)|*.*||");if (IDOK == openDlg.DoModal()){CString openFileName;openFileName = openDlg.GetFileName();CSocket sendSock;sendSock.Create();CString IPstr;this->GetDlgItem(IDC_IPADDRESS1)->GetWindowText(IPstr);if (sendSock.Connect(IPstr, 5000) == 0){return;}CFile sendFile;sendFile.Open(openDlg.GetPathName(), CFile::modeRead);sendSock.Send(openFileName, 500);UINT uiLength;uiLength = sendFile.GetLength();sendSock.Send(&uiLength, 4);int iBufSize = 1024 * 5;int iSize = iBufSize;LPBYTE pBuf = new BYTE[iBufSize];int iNumByte;UINT uiTotal = 0;while (uiTotal < uiLength){if ((int)(uiLength - uiTotal) < iBufSize){iSize = uiLength - uiTotal;}iSize = sendFile.Read(pBuf, iSize);int iCount = 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();}3.4运行结果说明:为了便于测试和观察,选择127.0.0.1的发送IP地址进行单机测试。
图3程序运行启动界面双击打开myFileTransfer.exe可执行程序后的程序启动界面如图3所示,然后在“对方IP 地址”栏中输入本地回送地址127.0.0.1准备进行发送文件。
图4发送文件选择界面单击“发送文件”按钮后,弹出如图4所示的文件选择界面,选择要发送的文件并单击“打开”按键,确定选择并将所选文件发送给接收方。
图5接受方接收到文件当接收方接收到发送方传来的文件时,接收方程序弹出如图5所示的“保存”界面,提示用户接收文件成功并进行保存。
图6接收图片自动显示当接收方接收的文件为图片时,程序调用操作系统默认的图片浏览器自动打开浏览接收到的图片。
当接收的是非图片文件时,程序则只是保存该文件,而不自动打开。
4实验感想通过独立完成了这次实验的全部内容,我对网络编程有了更全面、深刻地认识和了解,尤其是对Windows socket的掌握和编程应用。
由于我对MFC较为熟悉,所以在整个实验过程中,我采用MFC进行编程来实现这个传输文件的程序。
在程序实现之前,我通过网络上的基于socket网络编程资料和老师课上讲解的内容,认真全面地学习了Windows socket的运行机制和其在网络编程上的应用方法。
在设计实现阶段,我最先使用的是基础SOCKET类,但在通信双方传送文件的基本信息的具体实现时,遇到了不少的麻烦。
比如SOCKET类中的send方法的第二个参数类型是“const char *”用来指明一个存放将要发送数据的缓冲区,但在传文件信息长度int类型等非char *的变量时转化很麻烦。
于是,我查看MSDN文档了解到MFC已为开发者封装了一个很简便的CSOCKET类。
应用CSOCKET类能很方便容易地解决上面的问题,而且实现网络通信的流程也很清晰,最终我采用MFC封装的CSOCKET类编码实现的这次实验内容。
在接收图片自动显示的问题上,我试验了两种实现方式:用一个MFC中的承托图片控件来显示和调用操作系统默认的图片浏览程序来显示,对比操作效果和用户使用习惯,后者的解决方案更好,所以最终我采用调用操作系统默认的图片浏览程序来对图片文件进行自动打开显示。