c+++网络文件传输
网络基础 FTP协议

网络基础FTP协议文件传输协议(File Transfer Protocol,FTP)是计算机网络中使用最广泛的文件传输协议。
它提供交互式的访问,允许用户指明文件类型和格式,并允许对文件具有存取权限。
FTP协议屏蔽了各种计算机系统的细节,适合于在异构网络中任意计算机之间传送文件。
1.FTP传输模式FTP协议主要用来完成两台计算机之间的文件复制工作,从远程计算机复制文件到本地计算机上,称为下载文件;若将文件从本地计算机复制到远程计算机上,称为上载文件。
在TCP/IP协议中,FTP协议控制命令的TCP端口号为21,数据传输的TCP端口号为20。
使用FTP协议在计算机间传输文件,与计算机所处的位置、连接方式,以及是否使用相同的操作系统都无关。
其中,FTP协议的传输模式包括ASCⅡ传输模式和二进制数据传输模式两种。
●ASCⅡ传输模式用户在复制文件时,包含简单的ASCⅡ码文本。
如果远程计算机上运行的不是UNIX 操作系统,则文件在传输过程中,FTP协议将自动调整成远程计算机可以存储的文本文件格式。
该传输模式主要用于文本文件的传输。
●二进制数据传输模式该传输模式主要用于非文本文件的传输,例如使用FTP协议传输应用程序、数据库等文件,FTP协议不对其进行任何处理。
在该传输模式中,保存文件传输的位序,以便保持原始文件和复制文件逐位一一对应。
例如,Macintosh操作系统以二进制方式传送可执行文件到Windows操作系统中,FTP协议不会对其进行任何处理,即使该执行文件在Windows操作系统中无法运行。
如果在ASCⅡ模式下传输二进制文件,即使不需要对文件进行转译,FTP协议也会对文件进行转译。
使传输速度变慢,并且将造成文件数据损坏,以致传输过去的文件无法使用。
2.FTP工作原理FTP是基于客户/服务器模型而设计的,客户与服务器之间利用TCP建立连接。
与一般客户/服务器模型不同,FTP的客户端与服务器之间要建立双重连接,一个是控制连接,一个是数据连接。
在DotNet中实现跨Internet的文件加密传输

MF i a C+ + 6 0编 程 技 术 内 幕 . 北 京 机 械 工 业果很好 ,很适合电脑使用者 ,特别是大学生和
中小 学 生 ,对 保 护 他们 的视 力 很 有 好处 。安 装 上 这 个 软件 ,学
社 ,2 0 . 002
使 用类 似 H M T L的 Fl Fe i i d等 控件 进行 文 件上 传 ;而下 载 e l 时 ,把要 下载 的文 件共享 到公 网上 ,用 户可 以采用 H I r’ P或
P P方 式 直 接 进 行 下 载 。 这 些实 现 方 式 都 有 一 些 不 尽 如 人 意 的 r
/ 将文件 内容读入缓冲区 /
i e d e gh = flS ra R a b fe ,0 uf r Ra Lnt i e te m. e d《 u r ,b fe . L nt : e g h) whl i a L n t i Re d e gh!=0 e《 ) {
3 客户端接 受服务器 的反馈信 息 ,知道文件是否 上传成 .
地方 ,比如 ,F P方式无 法跨越 N T ( T r A 网络地址 转换 ) ,而 HIP方式在安全性和可靠性方 面都得 不到保证 ,在文件较大 r T
时 也 会 有一 定 的 限制 。
系 统 拓 扑 结构 图 微 软 公 司 推 出 的 D t e 平 台 架 构 ,具 有 支 持 多 种 编 程 语 o t N
it R a L n t = 0 n e d e g h i :
2 .服 务 器 端 接 受 请 求 , 判 断 文 件 是 否 存 在 ,若 文 件 存
在 ,返 回 “ 件已存在 ”的信 息和文件 的长度 ;若文 件不存 文
在 ,接 受 文 件 ,解 密 后 写 入 到 服 务 器 端 。
计算机网络协议常见网络协议的功能和使用

计算机网络协议常见网络协议的功能和使用计算机网络协议是为了实现计算机网络中数据传输和通信而制定的一系列规则和约定。
各种网络协议按照各自定义的格式和规定进行操作,以确保数据在网络中的正确传输和接收。
下面将介绍一些常见的计算机网络协议,包括它们的功能和使用。
1. TCP/IP协议TCP/IP协议是互联网的核心协议之一,它是由传输控制协议(TCP)和互联网协议(IP)组成的。
TCP负责在网络中提供可靠的数据传输,确保数据包按顺序到达目标;IP负责将数据包从源地址发送到目标地址,实现网络中不同设备之间的通信。
TCP/IP协议在互联网中广泛使用,包括网页浏览、电子邮件和文件传输等。
2. HTTP协议HTTP协议(超文本传输协议)是用于在Web浏览器和Web服务器之间传输超文本的协议。
它规定了客户端发送请求和服务器返回响应的格式。
HTTP协议使用URL(统一资源定位符)来指定要获取或发送的资源,例如网页、图片和视频等。
通过HTTP协议,用户可以使用浏览器浏览网页、下载文件和提交表单等。
3. FTP协议FTP协议(文件传输协议)是一种用于文件传输的协议。
它允许用户在本地计算机和远程服务器之间传输文件。
FTP协议支持文件上传、下载和删除等操作,用户可以使用FTP客户端软件连接到FTP服务器,并通过用户名和密码进行身份验证。
FTP协议通常用于网站维护、文件备份和文件共享等应用场景。
4. SMTP协议SMTP协议(简单邮件传输协议)是用于电子邮件传输的标准协议。
它负责将电子邮件从发送方传递到接收方的邮件服务器。
SMTP协议规定了电子邮件的格式和传输方式,包括邮件头、正文和附件等。
用户可以使用各种邮件客户端软件(如Outlook和Gmail)发送和接收邮件,SMTP协议保证了邮件的可靠传输。
5. DNS协议DNS协议(域名系统)是互联网上的一种分布式命名系统,用于将域名转换为IP地址。
它提供了一个将易记的域名映射到对应IP地址的机制,使用户可以使用域名访问网站,而不需要记住复杂的IP地址。
计算机网络(冯博琴)选择题

第1章引论1 在下列各组条目中,那一组不属于只有通过计算机网络才能完成的功能?CA 计算机系统间的文件传输;访问全球各地的信息和文件。
B 在多台计算机间共享应用程序;同时对应用程序输入数据。
C 数据处理作业的批处理;分时处理用户的数据处理要求。
D 享打印机;使用电子邮件。
2 第二代计算机网络的主要特点是:DA 主机与终端通过通信线路传递数据;B 网络通信的双方都是计算机;C 各计算机制造厂商网络结构标准化;D 基于网络体系结构的国际化标准3 计算机网络体系之所以采用层次结构的主要原因是:CA 层次结构允许每一层只能同相邻的上下层次发生联系。
B 层次结构优于模块化结构。
C 使各层次的功能相对独立,使得各层次实现技术的进步不影响相邻层次,从而保持体系结构的稳定性。
D 层次结构的方法可以简化计算机网络的实现。
4 计算机网络是一门综合技术的合成,其主要技术是:BA 计算机技术与多媒体技术B 计算机技术与通信技术C 电子技术与通信技术D 数字技术与模拟技术5 计算机网络最突出的优点是:BA 精度高B 共享资源C 可以分工协作D 传递信息6 对计算机网络按照信号频带占用方式来划分,可以分为:CA 双绞线网和光纤网B 局域网和广域网C 基带网和宽带网D 环形网和总线形网7 下列说法中正确的是:A 如果网络的服务区域不仅局限在一个局部范围内,则可能是广域网或城域网。
AB 今后计算机网络将主要面向于商业和教育。
C 调制解调器是网络中必需的硬件设备。
D 计算机网络的唯一缺点是无法实现可视化通信。
8 下面不属于网络拓扑结构的是:CA 环形结构B 总线结构C 层次结构D 网状结构9 下列有关网络拓扑结构的叙述中,最准确的是:CA 星形结构的缺点是,当需要增加新的工作站时成本比较高B 树型结构的线路复杂,网络管理也较困难C 早期局域网中最普遍采用的拓扑结构是总线结构D 网络的拓扑结构是指网络结点间的分布形式10 以下的网络分类方法中,哪一组分类方法有误?BA 局域网/广域网B 对等网/城域网C 环型网/星型网D 有线网/无线网11 将6台计算机用点-点方式全连接起来,则每台计算机需要5条线路,全网共需_____C___线路。
文件传输协议(FTP)

《网络协议》实验报告实验名称:文件传输协议(FTP)组别机器号:第六组主机B班级:网络13-3班学号:1320020306姓名:黄腾飞指导教师:陈虹成绩:一、实验目的1. 掌握FTP的工作原理2. 掌握FTP一些常用命令的使用方法及用途二、实验环境实验拓扑结构(标注IP地址和MAC地址):IP地址:172.16.0.62 MAC地址:002511-53EB30三、实验内容FTP的工作过程。
四、实验过程及结果分析FTP的工作过程本练习将主机A和B作为一组,主机C和D作为一组,主机E和F作为一组。
现仅以主机A、B所在组为例,其它组的操作参考主机A、B所在组的操作。
1. 主机B启动协议分析器进行数据捕获并设置过滤条件(提取FTP data和FTP control协议)。
2. 主机A登录FTP服务器:在实验环境中的FTP服务器(172.16.1.100)已经启动,并提供一个公共帐号,用户名是:anonymous,口令:无。
在命令行提示符下运行:(1)C:\>ftp 172.16.1.100(2)在“User:”提示符后输入用户名:anonymous(3)在“Password:”提示符后输入密码:无(4)在客户端上运行一个简单的操作,如:ftp> dir(5)在FTP提示符下输入“quit”退出FTP3. 察看主机B捕获的数据,保存会话命令(方法:会话交互视图/单击右键/保存会话命令菜单,保存为FTP.txt),并分析FTP的工作过程:●FTP使用的TCP端口有哪些___20\ 21______。
●分析FTP报文格式。
指出在捕获数据报文中含有用户名、密码的报文,是否可以看到用户名和密码?说明FTP的安全性?可以看到用户名和密码,安全性低。
使用TCP连接工具与服务器进行命令交互本练习将主机A和B作为一组,主机C和D作为一组,主机E和F作为一组。
现仅以主机A、B所在组为例,其它组的操作参考主机A、B所在组的操作。
网络教学中文件传输协议及控制策略的设计

在客户端和服务器 的对话 中 , 用到最多的是 目录编码和文件编
码. 为了便于管理和简化编码 , 我们采用 目录和文件分开编码 , 目录信息前 以ID I 在 F S 为报头 , 客户端在收
到后会先根据 ID I即可知道要解码的是 目 F S, 录信息字符 串; 在文件信息前 以IL I F S 为报头, 由于文件信息 要包括路径 、 和大小 , 类型 所以在编码时用“ ” / 将其分开 , 客户端收到后 , 会先根据 IL I即可知道要解码 FS , 的是文件信息字符串. 通过相应 的解码 即可获得文件的各项信息 , 所有 的文件信息和 目录信息都 以“ ” 分开 , 这样可 以使客户端很容易解码出每一个文件或 目录的编码信息.
网络 教 学 中文 件 传 输 协 议 及 控 制 策 略 的设 计
黄 晓梅 , 王 浩
( 安徽建筑工业学院 现代教育技术中心 , 合肥 202 ) 302
摘 要: 在互动式网络教学系统 中, 服务器需要传输大量的文件用于同客户端进行交互. 针对互动网络教学系统
中文件传输 的特 点 , 出了文件传 输协议 的设计方法 , 系统 中一些特殊传输 策略进行 了描述. 给 并对
组装 , 直到数据传输完毕 , 这时数据连接将被取消. 如此循环反复 , 直到会话结束.
2 数据 报的设计 和编码规则
2 1 高层协议数据报的设计 该系统中高层协议数据报的设计主要针对传输过程 中的控制会话过程 , . 采 用加密的 A CI S I字符流的形式进行传输 . 为确定数据报 的完整性 , 在高层协议数据报的开始处加上字符
sc 控件来完成与客户端 的连接 , ok 服务器最多允许 20个用户同时登录. 0
当需要进行文件传输时 , 客户端首先向服务器发出连接请求 , 服务器验证身份后 , 与客户端建立连接 , 双方进入会话状态 , 客户端可根据 自身权限在服务器浏览共享 目录 , 只要客户端登录权 限允许下载 , 即 它 可向服务器发 出数据连接请求. 当建立起数据连接后 , 双方就进入数据传输状态 , 由于 以太 网对数据 帧的 长度都有一个限制 , 所以需要将数据流进行分片 , 每片选定为 1 6 0字节 . 户端把收到 的数据 帧进行 4 ]客
一种基于快速否定应答的空间网络文件传输协议

第15卷第19期2015年7月 1671—1815(2015)19—0026—06 科学技术与工程
Science Technology and Engineering Vo1.15 No.19 Ju1.2015
⑥2015 Sci.Tech.Engrg.
一种基于快速否定应答的空问 网络文件传输协议
韩丰 晏 坚 陆建华 (清华大学电子工程系 ,宇航技术研究中心 ,北京100084)
摘要 针对空间网络中存在的高误码率、长延时、链路速率非对称等问题,提出了一种基于否定确认机制的远程文件管理 协议(remote file process protocol,RFPP)协议。RFPP协议采用了信令纠错、否定确认(negative acknowledgment,NAK)快速重传 和NAK帧结构压缩等机制,分析表明RFPP比CCSDS文件传输协议(CCSDS file delivery protocol,CFDP)具有更高的传输效 率。在低轨卫星非对称链路仿真场景下,RFPP比CFDP的效率提高了7.6%。RFPP协议已成功应用于灵巧通信试验卫星, 实测信道利用率大干90%。 关键词空间网络 文件传输协议 否定应答 中图法分类号TN927.2; 文献标志码A
随着航天技术的快速发展,航天器(卫星)的处 理能力不断增强,采用星上处理技术支持的各种空 间应用越来越丰富。文件传输协议是支持各种空间 业务的基础协议之一。由于空间网络存在长延时、 高误码率、链路非对称等特点,地面互联网中广泛应 用的TCP/FTP协议难以直接应用于空间网络进行 文件传输¨ 。 为适应空间网络的文件传输需求,空间数据系 统咨询委员会(consultative committee for space data systems,CCSDS)提出了CCSDS文件传输协议(CCS— DS file delivery protocol,CFDP)协议,通过四种否定 确认机制实现可靠传输 J,在空间环境下性能大幅 优于TCP/FTP协议 。在CFDP协议的基础上, 文献[6_9]提出了基于喷泉码的半反馈传输协 议,避免了反馈重传,但是引入喷泉码需要付出处 理延时和硬件开销的代价。文献[1O]提出了重复 发送错误数据包的机制,它将发生错误需要重传 的数据包进行多次重复传输,以增加发送延时为 代价,降低了重传次数。结合以上改进的CFDP协 议在深空通信(极长延时)条件下性能优异,但是 在往返延时不那么长(例如低轨卫星)的空问网络 2015年3月11日收到 国家自然科学基金(91338108, 91438206)、清华大学自主科研计划(2012Z10132)、 清华信息科学与技术国家实验室(筹)资助 第一作者简介:韩丰(199O一)男,硕士研究生。研究方向:空间网 络协议。E-mail:cwhanfeng@aliyun.tom。 通信作者简介:陆建华,教授,博士。研究方向:无线通信。E—mail: lhh—dee@tsinghua.edu.cn。 中,通过降低往返次数获得的收益不足以抵消协 议的额外开销。 本文提出了一种基于延时否定确认机制的RF— PP(remote file process protocol,远程文件管理协议) 协议,它采用信令纠错、否定确认(negative acknowl— edgment,NAK)快速重传和NAK帧结构压缩机制, 降低了重传次数、等待时间和发送延时。分析表明, RFPP比CFDP传输效率更高。 1 文件传输协议特征分析 TCP协议采用正确接收回传确认机制实现可靠 传输。对于每个成功接收的包,接收端都会回传相 应的ACK(acknowledgment,确认)。空间链路的长 延时使TCP发送窗口增长缓慢;高误码率造成的丢 包会使得发送端误认为链路拥塞,减小发送窗口。 这都导致TCP在空间网络中的吞吐量减小、传输效 率降低,性能明显下降。 CFDP文件传输协议分为可靠传输与不可靠传 输两种方式,其中可靠传输又分为延时否定、立即否 定、提示否定和异步否定四种机制l1 。与TCP协议 不同,CFDP协议采用否定确认方式保证传输可靠 性。接收端对未能正确接收的包,发送NAK包请求 重传。延时否定方式下接收端在文件片段全部发送 完毕后,回传表示全部丢包的NAK包。它相比于 TCP协议,发送窗口不受延时和误码率的影响。但 在链路误码率较高,链路速率非对称情况下,CFDP 协议存在信令误包率较高(未对信令进行保护)、反 向链路开销较大等问题,性能仍有提升空间。 l9期 韩丰,等:一种基于快速否定应答的空间网络文件传输协议 27 2砌 PP文件传输协议 RFPP文件传输协议是一种基于否定应答的文 件传输协议,它包括上传和下载两部分主要功能,协 议框架如下。 2.1帧结构 RFPP传输过程包括两种帧:命令帧和数据帧, 选取与链路层适配的定长帧结构,如图1所示。 命令帧格式 数据帧格式 图1 RFPP协议信息交互格式 Fig.1 Interactive information format of RFPP 2.2工作流程 RFPP协议中,文件可分为若干个文件片段,文 件片段可分为多个数据包,数据包以图1中的数据 帧形式传输,是RFPP协议中基本的数据传输单元。 RFPP协议下载流程可概括为以下步骤(上传过程 类似): 1)接收端发送文件片段下载请求。 2)发送端应答此请求并直接发送数据,以EOF (end of file,文件结束)命令帧结尾。 3)发送端完成发送全部数据后,接收端校验是 否全部正确接收,如果全部正确接收则转到步骤 5);否则发送下载补包请求NAK,并开启NAK计时 器。如果计时器到期接收端仍未收到补包,则重发 补包请求。补包请求使用图l中的命令帧格式,一 个命令帧中可以表示的最多补包数有限,如果请求 补包数量超过此上限则继续发送补包请求命令帧, 直到表示完全部补包。 4)发送端收到补包请求后,根据要求补包的编 号,重新发送相应数据包。重复步骤3)~4)直到所 有数据包全部正确接收。 5)接收端全部正确接收后,发送FIN(finished, 结束)命令帧,表示当前片段下载成功,请求结束当 前片段下载。 6)发送端收到成功接收命令帧后,发送结束片 段下载应答,标志着一次完整的片段下载过程结束。 7)如果接收端所下载文件多于1个片段,则重 复步骤1)一5),完成目标文件的下载。 2.3性能优势 RFPP协议相比于CFDP协议的传输效率提升 体现在以下三种机制中。 2.3.1 信令纠错 发送端 接. 这里的信令包括 EOF包和FIN包。EOF 和FIN包在每个文件片 段传输过程中各传输1 次。信令包一旦发生错一 误,就会带来1个信令 计时器的额外延时。通 常信令计时器设置为信 令发送延时、信令应答 发送延时复 ( r ou、nd -. 图2 NAK计时器示意图 trip time,往返时间)之盂. .2 I t e tio n…ske。 tc h of 和,可见信令包带来的 。 NAK ti 。 额外延时较高。与此同 时,由于链路层一般采用定长帧结构,对信令进行冗 余编码实际上利用了链路适配的填充字节,一般情 况下并不增加额外开销。经过信令纠错处理后,可 降低信令误包率,提升传输效率。 2.3.2 NAK快速重传 图2表示接收端发送NAK请求补包的过程。 接收端在发送NAK后会开启NAK计时器,其目的 是触发下一次NAK包(或FIN包)的发送。CFDP 的NAK计时器设置为图中的timer : timer3=2 Tp 。+ 71PDu+ AK。 式中 。表示传播延时, 。 表示数据包发送延 时, 表示NAK包发送延时, 表示请求重传包 数。CFDP协议只能等待timer 到期才能发送下个 NAK。但如果NAK出现误包,接收端仍需等待 timer 到时才能重传。RFPP协议将它拆分为两个 计时器timer1和timer2: timer1=2 p+ pkl+ -nak;
文件传输方便快捷的互联网小工具推荐

文件传输方便快捷的互联网小工具推荐在网络时代,文件的传输已经成为我们日常工作中不可或缺的一部分。
然而,有时我们会发现传输文件的过程复杂繁琐,耗费时间和精力。
为了解决这一问题,出现了许多便捷快速的互联网小工具,它们能够帮助我们方便地进行文件传输。
本文将为大家推荐几款功能强大、操作简单的互联网小工具,帮助大家提高工作效率。
一、蓝奏云蓝奏云是一款国内知名的云存储和在线文件传输服务平台。
它提供了30G的免费存储空间,用户可以将文件上传至云端,并生成一个唯一的文件链接。
通过这个链接,我们可以轻松地将文件分享给他人,省去了传统的复制粘贴操作。
蓝奏云还支持批量上传和下载,能够快速处理大量文件。
此外,蓝奏云还支持设置文件的有效期和密码保护,确保文件的安全性。
二、飞鱼传书飞鱼传书是一款不需要下载和安装的在线文件传输工具。
它的使用非常简单,只需要将文件拖拽至网页中即可完成传输。
飞鱼传书支持多种文件类型的传输,包括文档、图片、音频、视频等。
同时,它还提供了高速传输的选项,可以大幅度缩短文件传输的时间。
与传统的文件传输方式相比,飞鱼传书无需安装客户端,不占用设备存储空间,非常适合临时传输文件的场景。
三、微云微云是腾讯公司推出的一款云存储服务工具。
它提供了免费的10G存储空间,能够方便地存储、管理和分享文件。
微云支持多种上传方式,包括网页上传、手机端上传、电脑端上传等。
用户可以通过微云的网页或手机客户端随时随地上传和下载文件。
微云还支持创建共享文件夹,方便团队协作和文件共享。
同时,微云还提供了专属的微云传输工具,能够更加方便地进行文件传输。
四、坚果云坚果云是一款国内知名的在线云存储平台。
它提供了大容量的存储空间,用户可以将文件上传至坚果云后,通过生成的链接与他人分享。
坚果云支持多终端的同步,用户可以在电脑、手机和平板等设备上随时访问和管理自己的文件。
同时,坚果云还提供了强大的文件搜索功能,可以快速找到需要的文件。
坚果云还支持团队协作,多个用户可以共同编辑和管理文件,提高工作的效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
建议读者再看实验步骤之前,先阅读一下文章末尾的【注意事项】一节。
这将有助于更好的理解本章的实现。
一.单线程文件传输(I):·服务器端(负责发送数据)的实现1.建立一个基于对话框的工程Server,并在建立的过程中选择支持windows socket。
2.在对话框上添加“发送”按钮。
3.为“发送”按钮添加事件BN_CLICKED的响应函数OnSend()。
void CServerDlg::OnSend(){// TODO: Add your control notification handler code hereCFileDialog fd(TRUE); // CFileDialog是MFC提供的一个用于选择文件的对话框类CString filename;char fn[40];CSocket listenSocket, socketSend;CFile file;long FileLength;char* data;if(IDOK==fd.DoModal()) // 启动用于选择文件的对话框{//选择了文件filename=fd.GetFileName(); // 获取用户选择的文件的文件名if(!file.Open(filename.GetBuffer(0),CFile::modeRead| File::typeBinary)){AfxMessageBox(" 打开文件错误,取消发送!");return;}strcpy(fn,filename.GetBuffer(0));}else return; //按了取消按钮listenSocket.Create(7000,SOCK_STREAM);listenSocket.Listen(5);listenSocket.Accept(socketSend);FileLength = file.GetLength(); // 获取文件的长度socketSend.Send(&FileLength, 4); // 把要发送的文件的长度传送给对方socketSend.Send(fn,40); // 发送要传送的文件的文件名data = new char[FileLength]; //分配一块和要传输的文件一样大小的内存空间file.ReadHuge(data, FileLength); //把文件中所有的数据一次性读入datasocketSend.Send(data, FileLength); //把data中的数据都发送出去file.Close();delete data;socketSend.Close();}·客户端(负责接收数据)的实现1.建立一个基于对话框的工程,并在建立的过程中选择支持windows socket。
(为了能够利用Server端的代码,在程序编写时,可以复制Server的代码到Client目录,并在Server的基础上修改或添加代码)2.在对话框上添加“接收”按钮。
3.为“发送”按钮添加事件BN_CLICKED的响应函数OnReceive ()。
void CServerDlg::OnReceive(){// TODO: Add your control notification handler code hereCSocket socketReceive;CFile file;long FileLength;char * data;char fn[40];socketReceive.Create();socketReceive.Connect("127.0.0.1", 7000); //这里为了测试的方便,我们使用127.0.0.1本地回路IPsocketReceive.Receive(&FileLength, 4); //获取要接受的文件的长度socketReceive.Receive(fn, 40); //获取要接受的文件的文件名data = new char[FileLength];socketReceive.Receive(data, FileLength); //获取要接受的文件内容file.Open(fn,CFile::modeCreate|CFile::modeWrite | CFile::typeBinary); //在当前目录建立文件file.WriteHuge(data, FileLength);file.Close();delete data;socketReceive.Close();AfxMessageBox("接收文件成功");}上面的程序以最简单的方式实现了文件传输功能。
但正是因为它的简单,所以忽略了很多重要的东西。
读者读到这里的时候可以考虑一下可能存在着些什么问题。
在这里给出一些上面程序的不足:1.在本书的原理部分曾经提到阻塞式和非阻塞式两种套接字的工作方式。
在上面的程序中使用的CSocket类提供了阻塞式的服务,这令编写程序非常方便。
然而这却不利于程序的友好性和可用性——服务器端在没有获得客户端连接的时候固执的侦听,一点也不理会用户的命令。
对话框不再响应消息,用户只能用强制关闭来结束程序。
2.希望一次性地动态分配整个文件大小的堆存贮区作为读入数据的内存空间。
这个空间一方面受到堆大小的限制,另一方面也受到CFile类成员函数ReadHuge()和WriteHuge()的读写能力限制,还有Receive()和Send()函数一次能够发送的数据也以其参数的最大值为限,所以在遇到大中型文件的时候,系统将不能满足程序提出的动态分配大块内存的要求,这样传输便不得不终止。
3.在实际的网络传输中,网络情况是十分多变和复杂的。
通过CSocket的成员函数们的返回值可以了解传输的状态,然而在上面的程序中却没有使用这些异常控制,带来的直接后果就是当遇到网络拥塞或对方传送的数据暂时未到时,程序就会认为传输结束而出乎意料的终止。
4.在上面的程序中,程序没有传送文件的属性数据,而只通过套接字传送文件数据。
在实际应用中这种假设通常是不存在的,所以应当把文件属性也传给对方,以达到文件的完全复制。
改进方法:1.使用CAsyncSocket实现异步套接字,避免阻塞2.化整为零,把文件分若干次读入并发送3.在程序中加入异常控制语句已应付网络多变的情况4.在传送文件数据之前获取文件属性值传给对方下面将给出基于上述改进方案的前三点而重新编写的程序,对于第四点,有兴趣的读者可以自己实现。
二.单线程文件传输(II):·服务器端(负责发送数据)的实现1.建立一个基于对话框的工程Server,并在建立的过程中选择支持windows socket。
2.在对话框上添加“侦听”,“发送”按钮。
3.用Class Wizard添加一个派生于CAsyncSocket的类CMySocket。
4.添加CMySocket类的全局变量listenSocket用于侦听。
添加CMySocket类全局变量的位置,最宜在MySocket.cpp的头部。
如下:// MySocket.cpp : implementation file//#include "stdafx.h"#include "Server.h"#include "MySocket.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CMySocketCMySocket listenSocket;CMySocket::CMySocket(){}CMySocket::~CMySocket(){}本章中以后所有的CMySocket型全局变量都应仿效本段程序添加。
5.添加CMySocket类的全局变量sendSocket,用于传输数据6.为“发送”按钮添加事件BN_CLICKED的响应函数OnSend() #define ReadSize 500void CServerDlg ::OnSend(){// TODO: Add your control notification handler code hereCFile file;char data[ReadSize]; // 用于存放读入的文件数据块long ByteSended=0, FileLength,count;CFileDialog fd(TRUE);CString filename;char fn[40];if(IDOK==fd.DoModal()) // 启动用于选择文件的对话框{//选择了文件filename=fd.GetFileName(); //获取选择的文件的文件名if(!file.Open(filename.GetBuffer(0),CFile::modeRead|CFile::typeBinary)){AfxMessageBox("打开文件错误,取消发送!");return;}strcpy(fn,filename.GetBuffer(0));}else return; //按了取消按钮FileLength=file.GetLength();sendSocket.Send(&FileLength,sizeof(long));sendSocket.Send(fn,40);memset(data,0,sizeof(data));do{// 从文件读取数据,每次最多读入ReadSize个字节。
count 表示实际读入的字节数count=file.ReadHuge(data, ReadSize);// 发送数据while(SOCKET_ERROR==sendSocket.Send(data,count)){}// 统计已发送的字节数ByteSended =ByteSended+count;}while(ByteSended <FileLength);file.Close();}7.为“侦听”按钮添加事件BN_CLICKED的响应函数OnListen () void CServerDlg::Listen(){// TODO: Add your control notification handler code herelistenSocket.Create(7000);listenSocket.Listen();}8.为CMySocket类添加消息OnAccpet响应函数OnAccept()void CMySocket::OnAccept(int nErrorCode){// TODO: Add your specialized code here and/or call the base classif(!listenSocket.Accept(sendSocket)){AfxMessageBox("连接失败");return;}AfxMessageBox("连接成功");CAsyncSocket::OnAccept(nErrorCode);}·客户端(负责接收数据)的实现1.建立一个基于对话框的工程,并在建立的过程中选择支持windows socket。